mirror of
https://github.com/parse-community/parse-server
synced 2026-08-09 13:03:18 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c098889eeb | ||
|
|
e458be2d8b | ||
|
|
af8c9ff9f1 | ||
|
|
06cb79e6a5 | ||
|
|
2b26cc043e | ||
|
|
e0750ab813 | ||
|
|
6b2ca6938b | ||
|
|
62048260c9 | ||
|
|
929c4e1b0d | ||
|
|
66f7af90c3 | ||
|
|
57c029af5d | ||
|
|
56b123b624 | ||
|
|
eb253b3277 | ||
|
|
b3792121c2 | ||
|
|
12d854f7d9 | ||
|
|
7b8abf5bf3 | ||
|
|
922dc7636f | ||
|
|
d57908e229 | ||
|
|
916f92b443 | ||
|
|
d73b1cf5f2 | ||
|
|
d66c0b64a2 | ||
|
|
b1d1b737a8 | ||
|
|
1246c90e91 | ||
|
|
90f396b09c | ||
|
|
6aba824ec1 | ||
|
|
9f694dceb6 | ||
|
|
b45d0c443a | ||
|
|
ce9506161d | ||
|
|
b53853cff2 | ||
|
|
d9c6fb1c6f | ||
|
|
5fd73a72fd | ||
|
|
2e8e193f76 | ||
|
|
f8501fffb6 | ||
|
|
06a0b56720 | ||
|
|
2e604d0b8f | ||
|
|
afc18b4775 | ||
|
|
d5005570ec | ||
|
|
0a92cb7d37 | ||
|
|
7e7cc9a5fe | ||
|
|
6e36411ce7 | ||
|
|
4245a8f314 | ||
|
|
72c405d98e | ||
|
|
983121581d | ||
|
|
5743d752f7 | ||
|
|
dfa22391ad | ||
|
|
7b13661d08 | ||
|
|
cc9a217efb | ||
|
|
441a0dad79 | ||
|
|
9a5b3a5832 | ||
|
|
1daf36da99 | ||
|
|
2d766a9186 | ||
|
|
bff0ea96b8 | ||
|
|
d87dac1d09 | ||
|
|
e6d69f98cc | ||
|
|
1b8b1e9e58 | ||
|
|
cdd1afd923 | ||
|
|
603cbe563a | ||
|
|
dd419e8e50 | ||
|
|
a0ac8e0686 | ||
|
|
4cec333cf9 | ||
|
|
b4c8542a7e | ||
|
|
19264ba9ff | ||
|
|
d4beda14af | ||
|
|
42f75d6d94 | ||
|
|
92afcca4ee | ||
|
|
5b71993175 | ||
|
|
9ba9620bdf | ||
|
|
114d78e80a | ||
|
|
6f1210c325 | ||
|
|
dd41bf1739 | ||
|
|
97f2456a28 | ||
|
|
a6597ac669 | ||
|
|
0236efd113 | ||
|
|
d652517bbe | ||
|
|
3654f0280b | ||
|
|
6f060e0909 | ||
|
|
d69833332c | ||
|
|
78239ac907 | ||
|
|
f6ed5067b0 | ||
|
|
ea1ec9b325 | ||
|
|
5e67e7da43 | ||
|
|
85ec22ce3b | ||
|
|
2e708cc77c | ||
|
|
4f7fd1732b | ||
|
|
44015c3e35 | ||
|
|
93a88c5cde | ||
|
|
a11632eeff | ||
|
|
b088c76105 | ||
|
|
190ca5a1c6 | ||
|
|
ecd709e050 | ||
|
|
3bd5684f67 | ||
|
|
cbf9da517b | ||
|
|
36bee12c24 | ||
|
|
1cc3211256 | ||
|
|
fc8a6687d7 | ||
|
|
142eaa71bd | ||
|
|
e6a6354b29 | ||
|
|
ebb0727793 | ||
|
|
0abe9bb42d | ||
|
|
01b49b61ea | ||
|
|
d5fbd50fa8 | ||
|
|
33c1cdcd4e | ||
|
|
f8df89a499 | ||
|
|
80d518f91d | ||
|
|
c85501718e | ||
|
|
34614e0f78 | ||
|
|
4437ea73ba | ||
|
|
e848b541bd | ||
|
|
06bdec8219 | ||
|
|
d03ec18bcc | ||
|
|
6fc42a526f | ||
|
|
f095dffcc3 | ||
|
|
41fc7c1f21 | ||
|
|
d8d2a8da51 | ||
|
|
5426f5a4f7 | ||
|
|
d5ac0f7748 | ||
|
|
9d38212ee3 | ||
|
|
b308a54f59 | ||
|
|
76203f41db | ||
|
|
e60217382f | ||
|
|
a5ebbf36f0 | ||
|
|
2a937d3abe | ||
|
|
f0edcb6669 | ||
|
|
30a4b53334 | ||
|
|
63b506c61e | ||
|
|
d70d0d8734 | ||
|
|
d0a9c709fe | ||
|
|
6a743ca630 | ||
|
|
e98445ec10 | ||
|
|
ff12b31f0a | ||
|
|
1a0554fc28 | ||
|
|
b2db04cb77 | ||
|
|
f32f7fa829 | ||
|
|
5abc3ad467 | ||
|
|
9cec4ad3b8 | ||
|
|
cd6602f746 | ||
|
|
42064370b5 | ||
|
|
4e502113c2 | ||
|
|
fb6c343843 | ||
|
|
78050bb703 | ||
|
|
9d3f8a2cbf | ||
|
|
48f34b3b85 | ||
|
|
8c50b8921a | ||
|
|
f56049b34b | ||
|
|
ddf99a1a43 | ||
|
|
0f36b96fda | ||
|
|
ee3c86a243 | ||
|
|
ce06f60f79 | ||
|
|
e4da42d360 | ||
|
|
7f401ca850 | ||
|
|
9a340b81d8 | ||
|
|
45d5dfbb03 | ||
|
|
370215a39b | ||
|
|
c32ff20f4f | ||
|
|
2a75062583 | ||
|
|
8b29169644 | ||
|
|
cdf5a238f3 | ||
|
|
4cd7d8fac3 | ||
|
|
b1506995ad | ||
|
|
4d1bd9346f | ||
|
|
d279198db7 | ||
|
|
c361cfd7ad | ||
|
|
67bf868208 | ||
|
|
800b0392a3 | ||
|
|
2b7223355e | ||
|
|
e78c07e169 | ||
|
|
288e746888 | ||
|
|
61546aad9a | ||
|
|
a72eecae4e | ||
|
|
966f6bc697 | ||
|
|
86cd24f428 | ||
|
|
5b3e799eb9 | ||
|
|
71147eb066 | ||
|
|
f66795c971 | ||
|
|
f43afc5d40 | ||
|
|
e6e5a8c578 | ||
|
|
7a54e7d8d8 | ||
|
|
16e7e82f95 | ||
|
|
7ee0149b16 | ||
|
|
b3bb262d87 | ||
|
|
0075c660ee | ||
|
|
0dec1c80e2 | ||
|
|
489aeae784 | ||
|
|
37ec22b270 | ||
|
|
9d8955cf90 | ||
|
|
f2f772084f | ||
|
|
ad027c2822 | ||
|
|
10ff06d3b9 | ||
|
|
185aaff074 | ||
|
|
c11e891298 | ||
|
|
a6300a2201 | ||
|
|
84b2d072a6 | ||
|
|
7ccd6ce0d4 | ||
|
|
a5ef0be7f4 | ||
|
|
b08b930043 | ||
|
|
ff011dc54d | ||
|
|
6980bcc3dd | ||
|
|
a80cc733c2 | ||
|
|
d1b544712f | ||
|
|
7c4c6a6838 | ||
|
|
b966b91f37 | ||
|
|
c5a1bc886b | ||
|
|
1053363940 | ||
|
|
370f5f0eaa | ||
|
|
94bbc8e7d0 | ||
|
|
1469aaad17 | ||
|
|
40af386021 | ||
|
|
9a3774dc1c | ||
|
|
ec5337b07a | ||
|
|
75d97522cd | ||
|
|
0698c20997 | ||
|
|
3c13d8015c | ||
|
|
f2fb6bd610 | ||
|
|
19086a8112 | ||
|
|
fc805fc5da | ||
|
|
b791e13dfd | ||
|
|
c2fa25d846 | ||
|
|
12432f6455 | ||
|
|
1760dedf99 | ||
|
|
51e21d36a2 | ||
|
|
cc5f14e11a | ||
|
|
bfdcba8d5c | ||
|
|
bcd5f1717e | ||
|
|
48beb2e4b5 | ||
|
|
b08571774f | ||
|
|
81b22b21b5 | ||
|
|
1045eeb700 | ||
|
|
d56cd797fd | ||
|
|
5ffba089cb | ||
|
|
dcba8e0b7c | ||
|
|
437e188da9 | ||
|
|
a8a367ed84 | ||
|
|
3625b371cf | ||
|
|
7121ea0a16 | ||
|
|
a9dba442b1 | ||
|
|
d48de7d97a | ||
|
|
d52d35bc2c | ||
|
|
384c2a9ade | ||
|
|
63a3fea218 | ||
|
|
958c706ac6 | ||
|
|
5d653d9bcb | ||
|
|
4d44edbd5d | ||
|
|
19dea5bbd3 | ||
|
|
13bda61fc9 | ||
|
|
b6506de90b | ||
|
|
255cb15c19 | ||
|
|
312a4bc812 | ||
|
|
1b8f057904 | ||
|
|
c178acd347 | ||
|
|
927676b34e | ||
|
|
b60502d8a0 | ||
|
|
beecedbdf1 | ||
|
|
dd2b64ef65 | ||
|
|
76f0edc922 | ||
|
|
a5977f3816 | ||
|
|
352eeb217e |
@@ -1,45 +0,0 @@
|
||||
<!--
|
||||
**Please use this template. If you don't use this template, your issue may be closed without comment.**
|
||||
We use GitHub Issues for bugs.
|
||||
|
||||
If you have a non-bug question, ask on [Parse Community's Discourse forum](https://community.parseplatform.org/c/parse-server)
|
||||
|
||||
If you have a vulnerability disclosure, please follow our policy available here https://github.com/parse-community/parse-server/blob/master/SECURITY.md
|
||||
|
||||
You may also search through existing issues before opening a new one: https://github.com/parse-community/parse-server/issues?utf8=%E2%9C%93&q=is%3Aissue
|
||||
|
||||
-->
|
||||
|
||||
### Issue Description
|
||||
|
||||
<!-- Describe your issue in as much detail as possible. -->
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
<!-- Please include a detailed list of steps that reproduce the issue. Include curl commands when applicable. -->
|
||||
|
||||
#### Expected Results
|
||||
|
||||
<!-- What you expected to happen. -->
|
||||
|
||||
#### Actual Outcome
|
||||
|
||||
<!-- What is happening instead. -->
|
||||
|
||||
### Environment Setup
|
||||
|
||||
- **Server**
|
||||
- parse-server version (Be specific! Don't say 'latest'.) : [FILL THIS OUT]
|
||||
- Operating System: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, Heroku, Azure, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
- **Database**
|
||||
- MongoDB version: [FILL THIS OUT]
|
||||
- Storage engine: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, mLab, ObjectRocket, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
### Logs/Trace
|
||||
|
||||
Include all relevant logs. You can turn on additional logging by configuring VERBOSE=1 in your environment.
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
name: "\U0001F41B Report an issue"
|
||||
about: A feature of Parse Server is not working as expected.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### New Issue Checklist
|
||||
<!-- Please check the following boxes [ ] -> [x] before submitting your issue. Click the "Preview" tab for better readability. Thanks for reporting issues back to Parse Server! -->
|
||||
|
||||
- [ ] I am not disclosing a [vulnerability](https://github.com/parse-community/parse-server/blob/master/SECURITY.md).
|
||||
- [ ] I am not just asking a [question](https://github.com/parse-community/.github/blob/master/SUPPORT.md).
|
||||
- [ ] I have searched through [existing issues](https://github.com/parse-community/parse-server/issues?q=is%3Aissue).
|
||||
- [ ] I can reproduce the issue with the [latest version of Parse Server](https://github.com/parse-community/parse-server/releases). <!-- We don't investigate issues for outdated releases. -->
|
||||
|
||||
### Issue Description
|
||||
<!-- What is the specific issue with Parse Server? -->
|
||||
|
||||
### Steps to reproduce
|
||||
<!-- How can someone else reproduce the issue? -->
|
||||
|
||||
### Actual Outcome
|
||||
<!-- What outcome, for example query result, did you get? -->
|
||||
|
||||
### Expected Outcome
|
||||
<!-- What outcome, for example query result, did you expect? -->
|
||||
|
||||
### Environment
|
||||
<!-- Be specific with versions, don't use "latest" or semver ranges like "~x.y.z" or "^x.y.z". -->
|
||||
|
||||
Server
|
||||
- Parse Server version: `FILL_THIS_OUT`
|
||||
- Operating system: `FILL_THIS_OUT`
|
||||
- Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc): `FILL_THIS_OUT`
|
||||
|
||||
Database
|
||||
- System (MongoDB or Postgres): `FILL_THIS_OUT`
|
||||
- Database version: `FILL_THIS_OUT`
|
||||
- Local or remote host (MongoDB Atlas, mLab, AWS, Azure, Google Cloud, etc): `FILL_THIS_OUT`
|
||||
|
||||
Client
|
||||
- SDK (iOS, Android, JavaScript, PHP, Unity, etc): `FILL_THIS_OUT`
|
||||
- SDK version: `FILL_THIS_OUT`
|
||||
|
||||
### Logs
|
||||
<!-- Include relevant logs here. Turn on additional logging by configuring VERBOSE=1 in your environment. -->
|
||||
+5
-2
@@ -1,6 +1,9 @@
|
||||
---
|
||||
name: "\U0001F4A1 Feature request"
|
||||
about: Suggest an idea for this project
|
||||
name: "\U0001F4A1 Request a feature"
|
||||
about: Suggest new functionality or an enhancement of existing functionality.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
name: "🙋Getting Help"
|
||||
about: Join https://community.parseplatform.org
|
||||
|
||||
---
|
||||
@@ -1,56 +0,0 @@
|
||||
---
|
||||
name: "\U0001F525 parse-server 3.0.0"
|
||||
about: Report an issue while migrating to parse-server 3.0.0
|
||||
|
||||
---
|
||||
|
||||
<!---
|
||||
** Use this template only if you have an issue migrating to parse-server 3.0.0 **
|
||||
|
||||
If you have a question, ask on [Parse Community's Discourse forum](https://community.parseplatform.org/c/parse-server)
|
||||
|
||||
If you have a vulnerability disclosure, please follow our policy available here https://github.com/parse-community/parse-server/blob/master/SECURITY.md
|
||||
|
||||
You may also search through existing issues before opening a new one: https://github.com/parse-community/parse-server/issues?utf8=%E2%9C%93&q=is%3Aissue
|
||||
|
||||
--- Please use this template. If you don't use this template, your issue may be closed without comment. ---
|
||||
--->
|
||||
|
||||
# Before opening the issue please ensure that you have:
|
||||
|
||||
- [ ] [Read the migration guide](https://github.com/parse-community/parse-server/blob/master/3.0.0.md) to parse-server 3.0.0
|
||||
- [ ] [Read the migration guide](https://github.com/parse-community/Parse-SDK-JS/blob/master/2.0.0.md) to Parse SDK JS 2.0.0
|
||||
|
||||
### Issue Description
|
||||
|
||||
<!--- Describe your issue in as much detail as possible. -->
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
<!--- Please include a detailed list of steps that reproduce the issue. Include curl commands when applicable. --->
|
||||
|
||||
### Expected Results
|
||||
|
||||
<!--- What you expected to happen. --->
|
||||
|
||||
### Actual Outcome
|
||||
|
||||
<!--- What is happening instead. --->
|
||||
|
||||
### Environment Setup
|
||||
|
||||
- **Server**
|
||||
- parse-server version (Be specific! Don't say 'latest'.) : [FILL THIS OUT]
|
||||
- Operating System: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, Heroku, Azure, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
- **Database**
|
||||
- MongoDB version: [FILL THIS OUT]
|
||||
- Storage engine: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, mLab, ObjectRocket, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
### Logs/Trace
|
||||
|
||||
<!--- Include all relevant logs. You can turn on additional logging by configuring VERBOSE=1 in your environment. --->
|
||||
@@ -1,49 +0,0 @@
|
||||
---
|
||||
name: "\U0001F4F2 Push Notifications"
|
||||
about: Issues with setting up or delivering push notifications
|
||||
|
||||
---
|
||||
|
||||
<!---
|
||||
|
||||
**We use GitHub Issues for reporting bugs with parse-server.**
|
||||
|
||||
If you have a *question*, you should join the [Parse Community's Discourse forum](https://community.parseplatform.org/c/parse-server)
|
||||
|
||||
If you have a non-bug question, ask on Stack Overflow or Server Fault:
|
||||
- https://stackoverflow.com/questions/tagged/parse.com
|
||||
- https://serverfault.com/tags/parse
|
||||
|
||||
If you have a vulnerability disclosure, please follow our policy available here https://github.com/parse-community/parse-server/blob/master/SECURITY.md
|
||||
|
||||
You may also search through existing issues before opening a new one: https://github.com/parse-community/parse-server/issues?utf8=%E2%9C%93&q=is%3Aissue
|
||||
|
||||
--- Please use this template. If you don't use this template, your issue may be closed without comment. ---
|
||||
--->
|
||||
|
||||
### Issue Description
|
||||
|
||||
<!--- Describe your issue in as much detail as possible. -->
|
||||
|
||||
### Push Configuration
|
||||
|
||||
Please provide a copy of your `push` configuration here, obfuscating any sensitive part.
|
||||
|
||||
### Environment Setup
|
||||
|
||||
- **Server**
|
||||
- parse-server version (Be specific! Don't say 'latest'.) : [FILL THIS OUT]
|
||||
- Operating System: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, Heroku, Azure, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
- **Database**
|
||||
- MongoDB version: [FILL THIS OUT]
|
||||
- Storage engine: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, mLab, ObjectRocket, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
### Logs/Trace
|
||||
|
||||
<!--- Include all relevant logs. You can turn on additional logging by configuring VERBOSE=1 in your environment. --->
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
name: "\U0001F41B Report an issue"
|
||||
about: Report an issue on parse-server
|
||||
|
||||
---
|
||||
|
||||
<!---
|
||||
|
||||
**We use GitHub Issues for reporting bugs with parse-server.**
|
||||
|
||||
If you have a *question*, you should join the [Parse Community's Discourse forum](https://community.parseplatform.org/c/parse-server).
|
||||
|
||||
If you have a vulnerability disclosure, please follow our policy available here https://github.com/parse-community/parse-server/blob/master/SECURITY.md
|
||||
|
||||
You may also search through existing issues before opening a new one: https://github.com/parse-community/parse-server/issues?utf8=%E2%9C%93&q=is%3Aissue
|
||||
|
||||
--- Please use this template. If you don't use this template, your issue may be closed without comment. ---
|
||||
--->
|
||||
### Issue Description
|
||||
|
||||
<!--- Describe your issue in as much detail as possible. -->
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
<!--- Please include a detailed list of steps that reproduce the issue. Include curl commands when applicable. --->
|
||||
|
||||
### Expected Results
|
||||
|
||||
<!--- What you expected to happen. --->
|
||||
|
||||
### Actual Outcome
|
||||
|
||||
<!--- What is happening instead. --->
|
||||
|
||||
### Environment Setup
|
||||
|
||||
- **Server**
|
||||
- parse-server version (Be specific! Don't say 'latest'.) : [FILL THIS OUT]
|
||||
- Operating System: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, Heroku, Azure, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
- **Database**
|
||||
- MongoDB version: [FILL THIS OUT]
|
||||
- Storage engine: [FILL THIS OUT]
|
||||
- Hardware: [FILL THIS OUT]
|
||||
- Localhost or remote server? (AWS, mLab, ObjectRocket, Digital Ocean, etc): [FILL THIS OUT]
|
||||
|
||||
### Logs/Trace
|
||||
|
||||
<!--- Include all relevant logs. You can turn on additional logging by configuring VERBOSE=1 in your environment. --->
|
||||
@@ -0,0 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 🙋🏽♀️ Getting help with code
|
||||
url: https://stackoverflow.com/questions/tagged/parse-platform
|
||||
about: Get help with code-level questions on Stack Overflow.
|
||||
- name: 🙋 Getting general help
|
||||
url: https://community.parseplatform.org
|
||||
about: Get help with other questions on our Community Forum.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB |
+1
-1
@@ -17,7 +17,7 @@ exemptLabels:
|
||||
- security
|
||||
- up-for-grabs
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: wontfix
|
||||
staleLabel: stale
|
||||
# Limit to only `issues` not `pulls`
|
||||
only: issues
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
semi: true
|
||||
trailingComma: "es5"
|
||||
singleQuote: true
|
||||
arrowParens: "avoid"
|
||||
+13
-14
@@ -4,12 +4,6 @@ dist: xenial
|
||||
services:
|
||||
- redis
|
||||
- docker
|
||||
addons:
|
||||
postgresql: '11'
|
||||
apt:
|
||||
packages:
|
||||
- postgresql-11-postgis-2.5
|
||||
- postgresql-11-postgis-2.5-scripts
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
@@ -27,22 +21,14 @@ env:
|
||||
jobs:
|
||||
- MONGODB_VERSION=4.0.4 MONGODB_TOPOLOGY=replicaset MONGODB_STORAGE_ENGINE=wiredTiger
|
||||
- MONGODB_VERSION=3.6.9
|
||||
- PARSE_SERVER_TEST_DB=postgres
|
||||
- PARSE_SERVER_TEST_CACHE=redis
|
||||
- NODE_VERSION=12.12.0
|
||||
before_install:
|
||||
- nvm install $NODE_VERSION
|
||||
- nvm use $NODE_VERSION
|
||||
- npm install -g greenkeeper-lockfile@1
|
||||
- sudo sed -i 's/port = 5433/port = 5432/' /etc/postgresql/11/main/postgresql.conf
|
||||
- sudo cp /etc/postgresql/{10,11}/main/pg_hba.conf
|
||||
- sudo service postgresql stop
|
||||
- sudo service postgresql start 11
|
||||
before_script:
|
||||
- node -e 'require("./lib/index.js")'
|
||||
- psql -c 'create database parse_server_postgres_adapter_test_database;' -U postgres
|
||||
- psql -c 'CREATE EXTENSION postgis;' -U postgres -d parse_server_postgres_adapter_test_database
|
||||
- psql -c 'CREATE EXTENSION postgis_topology;' -U postgres -d parse_server_postgres_adapter_test_database
|
||||
- greenkeeper-lockfile-update
|
||||
script:
|
||||
- npm run lint
|
||||
@@ -54,6 +40,19 @@ jobs:
|
||||
allow_failures:
|
||||
- env: NODE_VERSION=12.12.0
|
||||
include:
|
||||
- stage:
|
||||
addons:
|
||||
postgresql: '11'
|
||||
apt:
|
||||
packages:
|
||||
- postgresql-11-postgis-3
|
||||
- postgresql-11-postgis-3-scripts
|
||||
env: POSTGRES_MAJOR_VERSION=11 PARSE_SERVER_TEST_DB=postgres PARSE_SERVER_TEST_DATABASE_URI=postgres://localhost:5433/parse_server_postgres_adapter_test_database
|
||||
before_install: bash scripts/before_install_postgres.sh
|
||||
before_script: bash scripts/before_script_postgres.sh
|
||||
script:
|
||||
- npm run lint
|
||||
- npm run coverage
|
||||
- stage: release
|
||||
node_js: '10'
|
||||
env:
|
||||
|
||||
+77
-7
@@ -1,7 +1,77 @@
|
||||
## Parse Server Changelog
|
||||
|
||||
### master
|
||||
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.1.0...master)
|
||||
[Full Changelog](https://github.com/parse-community/parse-server/compare/4.3.0...master)
|
||||
- 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).
|
||||
|
||||
### 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), [secuity 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)
|
||||
@@ -17,11 +87,11 @@ __BREAKING CHANGES:__
|
||||
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).
|
||||
@@ -35,11 +105,11 @@ __BREAKING CHANGES:__
|
||||
[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)
|
||||
|
||||
+23
-8
@@ -58,30 +58,45 @@ Once you have babel running in watch mode, you can start making changes to parse
|
||||
|
||||
If your pull request introduces a change that may affect the storage or retrieval of objects, you may want to make sure it plays nice with Postgres.
|
||||
|
||||
* Run the tests against the postgres database with `PARSE_SERVER_TEST_DB=postgres npm test`. You'll need to have postgres running on your machine and setup [appropriately](https://github.com/parse-community/parse-server/blob/master/.travis.yml#L37) or use [`Docker`](#run-a-parse-postgres-with-docker).
|
||||
* Run the tests against the postgres database with `PARSE_SERVER_TEST_DB=postgres PARSE_SERVER_TEST_DATABASE_URI=postgres://postgres:password@localhost:5432/parse_server_postgres_adapter_test_database npm run testonly`. You'll need to have postgres running on your machine and setup [appropriately](https://github.com/parse-community/parse-server/blob/master/.travis.yml#L43) or use [`Docker`](#run-a-parse-postgres-with-docker).
|
||||
* The Postgres adapter has a special debugger that traces all the sql commands. You can enable it with setting the environment variable `PARSE_SERVER_LOG_LEVEL=debug`
|
||||
* If your feature is intended to only work with MongoDB, you should disable PostgreSQL-specific tests with:
|
||||
|
||||
|
||||
- `describe_only_db('mongo')` // will create a `describe` that runs only on mongoDB
|
||||
- `it_only_db('mongo')` // will make a test that only runs on mongo
|
||||
- `it_exclude_dbs(['postgres'])` // will make a test that runs against all DB's but postgres
|
||||
* Similarly, if your feature is intended to only work with PostgreSQL, you should disable MongoDB-specific tests with:
|
||||
|
||||
- `describe_only_db('postgres')` // will create a `describe` that runs only on postgres
|
||||
- `it_only_db('postgres')` // will make a test that only runs on postgres
|
||||
- `it_exclude_dbs(['mongo'])` // will make a test that runs against all DB's but mongo
|
||||
|
||||
#### Run a Parse Postgres with Docker
|
||||
#### Run Postgres setup for Parse with Docker
|
||||
|
||||
To launch the compatible Postgres instance, copy and paste the following line into your shell:
|
||||
[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:
|
||||
|
||||
```sh
|
||||
docker run -d --name parse-postgres -p 5432:5432 -e POSTGRES_USER=$USER --rm mdillon/postgis:11-alpine && sleep 5 && docker exec -it parse-postgres psql -U $USER -c 'create database parse_server_postgres_adapter_test_database;' && docker exec -it parse-postgres psql -U $USER -c 'CREATE EXTENSION postgis;' -d parse_server_postgres_adapter_test_database && docker exec -it parse-postgres psql -U $USER -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: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 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:
|
||||
|
||||
```sh
|
||||
```
|
||||
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:
|
||||
|
||||
```
|
||||
#Install additional scripts. These are run in abc order during initial start
|
||||
COPY ./scripts/setup-dbs.sh /docker-entrypoint-initdb.d/setup-dbs.sh
|
||||
RUN chmod +x /docker-entrypoint-initdb.d/setup-dbs.sh
|
||||
```
|
||||
|
||||
Note that the script above will ONLY be executed during initialization of the container with no data in the database, see the official [Postgres image](https://hub.docker.com/_/postgres) for details. If you want to use the script to run again be sure there is no data in the /var/lib/postgresql/data of the container.
|
||||
|
||||
### Generate Parse Server Config Definition
|
||||
|
||||
If you want to make changes to [Parse Server Configuration][config] add the desired configuration to [src/Options/index.js][config-index] and run `npm run definitions`. This will output [src/Options/Definitions.js][config-def] and [src/Options/docs.js][config-docs].
|
||||
If you want to make changes to [Parse Server Configuration][config] add the desired configuration to [src/Options/index.js][config-index] and run `npm run definitions`. This will output [src/Options/Definitions.js][config-def] and [src/Options/docs.js][config-docs].
|
||||
|
||||
To view docs run `npm run docs` and check the `/out` directory.
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<a href="https://codecov.io/github/parse-community/parse-server?branch=master"><img alt="Coverage status" src="https://img.shields.io/codecov/c/github/parse-community/parse-server/master.svg"></a>
|
||||
<a href="https://www.npmjs.com/package/parse-server"><img alt="npm version" src="https://img.shields.io/npm/v/parse-server.svg?style=flat"></a>
|
||||
<a href="https://community.parseplatform.org/"><img alt="Join the conversation" src="https://img.shields.io/discourse/https/community.parseplatform.org/topics.svg"></a>
|
||||
<a href="https://greenkeeper.io/"><img alt="Greenkeeper badge" src="https://badges.greenkeeper.io/parse-community/parse-server.svg"></a>
|
||||
<a href="https://snyk.io/test/github/parse-community/parse-server"><img alt="Snyk badge" src="https://snyk.io/test/github/parse-community/parse-server/badge.svg"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="#backers"><img alt="Backers on Open Collective" src="https://opencollective.com/parse-server/backers/badge.svg" /></a>
|
||||
<a href="#sponsors"><img alt="Sponsors on Open Collective" src="https://opencollective.com/parse-server/sponsors/badge.svg" /></a>
|
||||
<a href="#backers"><img alt="Backers on Open Collective" src="https://opencollective.com/parse-server/tiers/backers/badge.svg" /></a>
|
||||
<a href="#sponsors"><img alt="Sponsors on Open Collective" src="https://opencollective.com/parse-server/tiers/sponsors/badge.svg" /></a>
|
||||
</p>
|
||||
<br>
|
||||
|
||||
@@ -60,7 +60,7 @@ The full documentation for Parse Server is available in the [wiki](https://githu
|
||||
- [Configuring File Adapters](#configuring-file-adapters)
|
||||
- [Logging](#logging)
|
||||
- [Live Queries](#live-queries)
|
||||
- [GraphQL (beta)](#graphql-beta)
|
||||
- [GraphQL](#graphql)
|
||||
- [Upgrading to 3.0.0](#upgrading-to-300)
|
||||
- [Support](#support)
|
||||
- [Ride the Bleeding Edge](#want-to-ride-the-bleeding-edge)
|
||||
@@ -79,7 +79,7 @@ The fastest and easiest way to get started is to run MongoDB and Parse Server lo
|
||||
Before you start make sure you have installed:
|
||||
|
||||
- [NodeJS](https://www.npmjs.com/) that includes `npm`
|
||||
- [MongoDB](https://www.mongodb.com/) or [PostgreSQL](https://www.postgresql.org/)
|
||||
- [MongoDB](https://www.mongodb.com/) or [PostgreSQL](https://www.postgresql.org/)(with [PostGIS](https://postgis.net) 2.2.0 or higher)
|
||||
- Optionally [Docker](https://www.docker.com/)
|
||||
|
||||
### Locally
|
||||
@@ -388,6 +388,39 @@ Parse Server allows developers to choose from several options when hosting files
|
||||
|
||||
`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).
|
||||
|
||||
### Idempodency Enforcement
|
||||
|
||||
**Caution, this is an experimental feature that may not be appropriate for production.**
|
||||
|
||||
This feature deduplicates identical requests that are received by Parse Server mutliple times, typically due to network issues or network adapter access restrictions on mobile operating systems.
|
||||
|
||||
Identical requests are identified by their request header `X-Parse-Request-Id`. Therefore a client request has to include this header for deduplication to be applied. Requests that do not contain this header cannot be deduplicated and are processed normally by Parse Server. This means rolling out this feature to clients is seamless as Parse Server still processes request without this header when this feature is enbabled.
|
||||
|
||||
> This feature needs to be enabled on the client side to send the header and on the server to process the header. Refer to the specific Parse SDK docs to see whether the feature is supported yet.
|
||||
|
||||
Deduplication is only done for object creation and update (`POST` and `PUT` requests). Deduplication is not done for object finding and deletion (`GET` and `DELETE` requests), as these operations are already idempotent by definition.
|
||||
|
||||
#### Configuration example
|
||||
```
|
||||
let api = new ParseServer({
|
||||
idempotencyOptions: {
|
||||
paths: [".*"], // enforce for all requests
|
||||
ttl: 120 // keep request IDs for 120s
|
||||
}
|
||||
}
|
||||
```
|
||||
#### Parameters
|
||||
|
||||
| Parameter | Optional | Type | Default value | Example values | Environment variable | Description |
|
||||
|-----------|----------|--------|---------------|-----------|-----------|-------------|
|
||||
| `idempotencyOptions` | yes | `Object` | `undefined` | | PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_OPTIONS | Setting this enables idempotency enforcement for the specified paths. |
|
||||
| `idempotencyOptions.paths`| yes | `Array<String>` | `[]` | `.*` (all paths, includes the examples below), <br>`functions/.*` (all functions), <br>`jobs/.*` (all jobs), <br>`classes/.*` (all classes), <br>`functions/.*` (all functions), <br>`users` (user creation / update), <br>`installations` (installation creation / update) | PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_PATHS | An array of path patterns that have to match the request path for request deduplication to be enabled. The mount path must not be included, for example to match the request path `/parse/functions/myFunction` specifiy the path pattern `functions/myFunction`. A trailing slash of the request path is ignored, for example the path pattern `functions/myFunction` matches both `/parse/functions/myFunction` and `/parse/functions/myFunction/`. |
|
||||
| `idempotencyOptions.ttl` | yes | `Integer` | `300` | `60` (60 seconds) | PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_TTL | The duration in seconds after which a request record is discarded from the database. Duplicate requests due to network issues can be expected to arrive within milliseconds up to several seconds. This value must be greater than `0`. |
|
||||
|
||||
#### Notes
|
||||
|
||||
- This feature is currently only available for MongoDB and not for Postgres.
|
||||
|
||||
### Logging
|
||||
|
||||
Parse Server will, by default, log:
|
||||
@@ -410,12 +443,10 @@ Live queries are meant to be used in real-time reactive applications, where just
|
||||
|
||||
Take a look at [Live Query Guide](https://docs.parseplatform.org/parse-server/guide/#live-queries), [Live Query Server Setup Guide](https://docs.parseplatform.org/parse-server/guide/#scalability) and [Live Query Protocol Specification](https://github.com/parse-community/parse-server/wiki/Parse-LiveQuery-Protocol-Specification). You can setup a standalone server or multiple instances for scalability (recommended).
|
||||
|
||||
# GraphQL (beta)
|
||||
# GraphQL
|
||||
|
||||
[GraphQL](https://graphql.org/), developed by Facebook, is an open-source data query and manipulation language for APIs. In addition to the traditional REST API, Parse Server automatically generates a GraphQL API based on your current application schema. Parse Server also allows you to define your custom GraphQL queries and mutations, whose resolvers can be bound to your cloud code functions.
|
||||
|
||||
⚠️ The Parse GraphQL ```beta``` implementation is fully functional but discussions are taking place on how to improve it. So new versions of Parse Server can bring breaking changes to the current API.
|
||||
|
||||
## Running
|
||||
|
||||
### Using the CLI
|
||||
@@ -735,18 +766,6 @@ All the Cloud Code interfaces also have been updated to reflect those changes, a
|
||||
|
||||
We have written up a [migration guide](3.0.0.md), hoping this will help you transition to the next major release.
|
||||
|
||||
# Support
|
||||
|
||||
Please take a look at our [support document](https://github.com/parse-community/.github/blob/master/SUPPORT.md).
|
||||
|
||||
If you believe you've found an issue with Parse Server, make sure these boxes are checked before [reporting an issue](https://github.com/parse-community/parse-server/issues):
|
||||
|
||||
- [ ] You've met the [prerequisites](http://docs.parseplatform.org/parse-server/guide/#prerequisites).
|
||||
|
||||
- [ ] You're running the [latest version](https://github.com/parse-community/parse-server/releases) of Parse Server.
|
||||
|
||||
- [ ] You've searched through [existing issues](https://github.com/parse-community/parse-server/issues?utf8=%E2%9C%93&q=). Chances are that your issue has been reported or resolved before.
|
||||
|
||||
# Want to ride the bleeding edge?
|
||||
|
||||
It is recommend to use builds deployed npm for many reasons, but if you want to use
|
||||
|
||||
+15
-10
File diff suppressed because one or more lines are too long
+145
-35
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -3,11 +3,14 @@
|
||||
// Helper functions for accessing the instagram API.
|
||||
var Parse = require('parse/node').Parse;
|
||||
|
||||
const httpsRequest = require('./httpsRequest'); // Returns a promise that fulfills iff this user id is valid.
|
||||
const httpsRequest = require('./httpsRequest');
|
||||
|
||||
const defaultURL = 'https://graph.instagram.com/'; // Returns a promise that fulfills if this user id is valid.
|
||||
|
||||
function validateAuthData(authData) {
|
||||
return request('users/self/?access_token=' + authData.access_token).then(response => {
|
||||
const apiURL = authData.apiURL || defaultURL;
|
||||
const path = `${apiURL}me?fields=id&access_token=${authData.access_token}`;
|
||||
return httpsRequest.get(path).then(response => {
|
||||
if (response && response.data && response.data.id == authData.id) {
|
||||
return;
|
||||
}
|
||||
@@ -19,15 +22,10 @@ function validateAuthData(authData) {
|
||||
|
||||
function validateAppId() {
|
||||
return Promise.resolve();
|
||||
} // A promisey wrapper for api requests
|
||||
|
||||
|
||||
function request(path) {
|
||||
return httpsRequest.get('https://api.instagram.com/v1/' + path);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
validateAppId: validateAppId,
|
||||
validateAuthData: validateAuthData
|
||||
validateAppId,
|
||||
validateAuthData
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2luc3RhZ3JhbS5qcyJdLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwidGhlbiIsInJlc3BvbnNlIiwiZGF0YSIsImlkIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwidmFsaWRhdGVBcHBJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicGF0aCIsImdldCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxJQUFJQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQVAsQ0FBc0JELEtBQWxDOztBQUNBLE1BQU1FLFlBQVksR0FBR0QsT0FBTyxDQUFDLGdCQUFELENBQTVCLEMsQ0FFQTs7O0FBQ0EsU0FBU0UsZ0JBQVQsQ0FBMEJDLFFBQTFCLEVBQW9DO0FBQ2xDLFNBQU9DLE9BQU8sQ0FBQyw4QkFBOEJELFFBQVEsQ0FBQ0UsWUFBeEMsQ0FBUCxDQUE2REMsSUFBN0QsQ0FDTEMsUUFBUSxJQUFJO0FBQ1YsUUFBSUEsUUFBUSxJQUFJQSxRQUFRLENBQUNDLElBQXJCLElBQTZCRCxRQUFRLENBQUNDLElBQVQsQ0FBY0MsRUFBZCxJQUFvQk4sUUFBUSxDQUFDTSxFQUE5RCxFQUFrRTtBQUNoRTtBQUNEOztBQUNELFVBQU0sSUFBSVYsS0FBSyxDQUFDVyxLQUFWLENBQ0pYLEtBQUssQ0FBQ1csS0FBTixDQUFZQyxnQkFEUixFQUVKLDBDQUZJLENBQU47QUFJRCxHQVRJLENBQVA7QUFXRCxDLENBRUQ7OztBQUNBLFNBQVNDLGFBQVQsR0FBeUI7QUFDdkIsU0FBT0MsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDRCxDLENBRUQ7OztBQUNBLFNBQVNWLE9BQVQsQ0FBaUJXLElBQWpCLEVBQXVCO0FBQ3JCLFNBQU9kLFlBQVksQ0FBQ2UsR0FBYixDQUFpQixrQ0FBa0NELElBQW5ELENBQVA7QUFDRDs7QUFFREUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQ2ZOLEVBQUFBLGFBQWEsRUFBRUEsYUFEQTtBQUVmVixFQUFBQSxnQkFBZ0IsRUFBRUE7QUFGSCxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgaW5zdGFncmFtIEFQSS5cbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcbmNvbnN0IGh0dHBzUmVxdWVzdCA9IHJlcXVpcmUoJy4vaHR0cHNSZXF1ZXN0Jyk7XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgcmV0dXJuIHJlcXVlc3QoJ3VzZXJzL3NlbGYvP2FjY2Vzc190b2tlbj0nICsgYXV0aERhdGEuYWNjZXNzX3Rva2VuKS50aGVuKFxuICAgIHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEuaWQgPT0gYXV0aERhdGEuaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICAnSW5zdGFncmFtIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLidcbiAgICAgICk7XG4gICAgfVxuICApO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuLy8gQSBwcm9taXNleSB3cmFwcGVyIGZvciBhcGkgcmVxdWVzdHNcbmZ1bmN0aW9uIHJlcXVlc3QocGF0aCkge1xuICByZXR1cm4gaHR0cHNSZXF1ZXN0LmdldCgnaHR0cHM6Ly9hcGkuaW5zdGFncmFtLmNvbS92MS8nICsgcGF0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdfQ==
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2luc3RhZ3JhbS5qcyJdLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJkZWZhdWx0VVJMIiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwiYXBpVVJMIiwicGF0aCIsImFjY2Vzc190b2tlbiIsImdldCIsInRoZW4iLCJyZXNwb25zZSIsImRhdGEiLCJpZCIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsInZhbGlkYXRlQXBwSWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxJQUFJQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQVAsQ0FBc0JELEtBQWxDOztBQUNBLE1BQU1FLFlBQVksR0FBR0QsT0FBTyxDQUFDLGdCQUFELENBQTVCOztBQUNBLE1BQU1FLFVBQVUsR0FBRyw4QkFBbkIsQyxDQUVBOztBQUNBLFNBQVNDLGdCQUFULENBQTBCQyxRQUExQixFQUFvQztBQUNsQyxRQUFNQyxNQUFNLEdBQUdELFFBQVEsQ0FBQ0MsTUFBVCxJQUFtQkgsVUFBbEM7QUFDQSxRQUFNSSxJQUFJLEdBQUksR0FBRUQsTUFBTyw2QkFBNEJELFFBQVEsQ0FBQ0csWUFBYSxFQUF6RTtBQUNBLFNBQU9OLFlBQVksQ0FBQ08sR0FBYixDQUFpQkYsSUFBakIsRUFBdUJHLElBQXZCLENBQTRCQyxRQUFRLElBQUk7QUFDN0MsUUFBSUEsUUFBUSxJQUFJQSxRQUFRLENBQUNDLElBQXJCLElBQTZCRCxRQUFRLENBQUNDLElBQVQsQ0FBY0MsRUFBZCxJQUFvQlIsUUFBUSxDQUFDUSxFQUE5RCxFQUFrRTtBQUNoRTtBQUNEOztBQUNELFVBQU0sSUFBSWIsS0FBSyxDQUFDYyxLQUFWLENBQ0pkLEtBQUssQ0FBQ2MsS0FBTixDQUFZQyxnQkFEUixFQUVKLDBDQUZJLENBQU47QUFJRCxHQVJNLENBQVA7QUFTRCxDLENBRUQ7OztBQUNBLFNBQVNDLGFBQVQsR0FBeUI7QUFDdkIsU0FBT0MsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDRDs7QUFFREMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQ2ZKLEVBQUFBLGFBRGU7QUFFZlosRUFBQUE7QUFGZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgaW5zdGFncmFtIEFQSS5cbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcbmNvbnN0IGh0dHBzUmVxdWVzdCA9IHJlcXVpcmUoJy4vaHR0cHNSZXF1ZXN0Jyk7XG5jb25zdCBkZWZhdWx0VVJMID0gJ2h0dHBzOi8vZ3JhcGguaW5zdGFncmFtLmNvbS8nO1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgY29uc3QgYXBpVVJMID0gYXV0aERhdGEuYXBpVVJMIHx8IGRlZmF1bHRVUkw7XG4gIGNvbnN0IHBhdGggPSBgJHthcGlVUkx9bWU/ZmllbGRzPWlkJmFjY2Vzc190b2tlbj0ke2F1dGhEYXRhLmFjY2Vzc190b2tlbn1gO1xuICByZXR1cm4gaHR0cHNSZXF1ZXN0LmdldChwYXRoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLmlkID09IGF1dGhEYXRhLmlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnSW5zdGFncmFtIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLidcbiAgICApO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdfQ==
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+26
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -14,7 +14,7 @@ const createObject = async (className, fields, config, auth, info) => {
|
||||
fields = {};
|
||||
}
|
||||
|
||||
return (await _rest.default.create(config, auth, className, fields, info.clientSDK)).response;
|
||||
return (await _rest.default.create(config, auth, className, fields, info.clientSDK, info.context)).response;
|
||||
};
|
||||
|
||||
exports.createObject = createObject;
|
||||
@@ -26,15 +26,15 @@ const updateObject = async (className, objectId, fields, config, auth, info) =>
|
||||
|
||||
return (await _rest.default.update(config, auth, className, {
|
||||
objectId
|
||||
}, fields, info.clientSDK)).response;
|
||||
}, fields, info.clientSDK, info.context)).response;
|
||||
};
|
||||
|
||||
exports.updateObject = updateObject;
|
||||
|
||||
const deleteObject = async (className, objectId, config, auth, info) => {
|
||||
await _rest.default.del(config, auth, className, objectId, info.clientSDK);
|
||||
await _rest.default.del(config, auth, className, objectId, info.context);
|
||||
return true;
|
||||
};
|
||||
|
||||
exports.deleteObject = deleteObject;
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2hlbHBlcnMvb2JqZWN0c011dGF0aW9ucy5qcyJdLCJuYW1lcyI6WyJjcmVhdGVPYmplY3QiLCJjbGFzc05hbWUiLCJmaWVsZHMiLCJjb25maWciLCJhdXRoIiwiaW5mbyIsInJlc3QiLCJjcmVhdGUiLCJjbGllbnRTREsiLCJyZXNwb25zZSIsInVwZGF0ZU9iamVjdCIsIm9iamVjdElkIiwidXBkYXRlIiwiZGVsZXRlT2JqZWN0IiwiZGVsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7QUFFQSxNQUFNQSxZQUFZLEdBQUcsT0FBT0MsU0FBUCxFQUFrQkMsTUFBbEIsRUFBMEJDLE1BQTFCLEVBQWtDQyxJQUFsQyxFQUF3Q0MsSUFBeEMsS0FBaUQ7QUFDcEUsTUFBSSxDQUFDSCxNQUFMLEVBQWE7QUFDWEEsSUFBQUEsTUFBTSxHQUFHLEVBQVQ7QUFDRDs7QUFFRCxTQUFPLENBQUMsTUFBTUksY0FBS0MsTUFBTCxDQUFZSixNQUFaLEVBQW9CQyxJQUFwQixFQUEwQkgsU0FBMUIsRUFBcUNDLE1BQXJDLEVBQTZDRyxJQUFJLENBQUNHLFNBQWxELENBQVAsRUFDSkMsUUFESDtBQUVELENBUEQ7Ozs7QUFTQSxNQUFNQyxZQUFZLEdBQUcsT0FDbkJULFNBRG1CLEVBRW5CVSxRQUZtQixFQUduQlQsTUFIbUIsRUFJbkJDLE1BSm1CLEVBS25CQyxJQUxtQixFQU1uQkMsSUFObUIsS0FPaEI7QUFDSCxNQUFJLENBQUNILE1BQUwsRUFBYTtBQUNYQSxJQUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNEOztBQUVELFNBQU8sQ0FBQyxNQUFNSSxjQUFLTSxNQUFMLENBQ1pULE1BRFksRUFFWkMsSUFGWSxFQUdaSCxTQUhZLEVBSVo7QUFBRVUsSUFBQUE7QUFBRixHQUpZLEVBS1pULE1BTFksRUFNWkcsSUFBSSxDQUFDRyxTQU5PLENBQVAsRUFPSkMsUUFQSDtBQVFELENBcEJEOzs7O0FBc0JBLE1BQU1JLFlBQVksR0FBRyxPQUFPWixTQUFQLEVBQWtCVSxRQUFsQixFQUE0QlIsTUFBNUIsRUFBb0NDLElBQXBDLEVBQTBDQyxJQUExQyxLQUFtRDtBQUN0RSxRQUFNQyxjQUFLUSxHQUFMLENBQVNYLE1BQVQsRUFBaUJDLElBQWpCLEVBQXVCSCxTQUF2QixFQUFrQ1UsUUFBbEMsRUFBNENOLElBQUksQ0FBQ0csU0FBakQsQ0FBTjtBQUNBLFNBQU8sSUFBUDtBQUNELENBSEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVzdCBmcm9tICcuLi8uLi9yZXN0JztcblxuY29uc3QgY3JlYXRlT2JqZWN0ID0gYXN5bmMgKGNsYXNzTmFtZSwgZmllbGRzLCBjb25maWcsIGF1dGgsIGluZm8pID0+IHtcbiAgaWYgKCFmaWVsZHMpIHtcbiAgICBmaWVsZHMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiAoYXdhaXQgcmVzdC5jcmVhdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIGZpZWxkcywgaW5mby5jbGllbnRTREspKVxuICAgIC5yZXNwb25zZTtcbn07XG5cbmNvbnN0IHVwZGF0ZU9iamVjdCA9IGFzeW5jIChcbiAgY2xhc3NOYW1lLFxuICBvYmplY3RJZCxcbiAgZmllbGRzLFxuICBjb25maWcsXG4gIGF1dGgsXG4gIGluZm9cbikgPT4ge1xuICBpZiAoIWZpZWxkcykge1xuICAgIGZpZWxkcyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIChhd2FpdCByZXN0LnVwZGF0ZShcbiAgICBjb25maWcsXG4gICAgYXV0aCxcbiAgICBjbGFzc05hbWUsXG4gICAgeyBvYmplY3RJZCB9LFxuICAgIGZpZWxkcyxcbiAgICBpbmZvLmNsaWVudFNES1xuICApKS5yZXNwb25zZTtcbn07XG5cbmNvbnN0IGRlbGV0ZU9iamVjdCA9IGFzeW5jIChjbGFzc05hbWUsIG9iamVjdElkLCBjb25maWcsIGF1dGgsIGluZm8pID0+IHtcbiAgYXdhaXQgcmVzdC5kZWwoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG9iamVjdElkLCBpbmZvLmNsaWVudFNESyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlT2JqZWN0LCB1cGRhdGVPYmplY3QsIGRlbGV0ZU9iamVjdCB9O1xuIl19
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2hlbHBlcnMvb2JqZWN0c011dGF0aW9ucy5qcyJdLCJuYW1lcyI6WyJjcmVhdGVPYmplY3QiLCJjbGFzc05hbWUiLCJmaWVsZHMiLCJjb25maWciLCJhdXRoIiwiaW5mbyIsInJlc3QiLCJjcmVhdGUiLCJjbGllbnRTREsiLCJjb250ZXh0IiwicmVzcG9uc2UiLCJ1cGRhdGVPYmplY3QiLCJvYmplY3RJZCIsInVwZGF0ZSIsImRlbGV0ZU9iamVjdCIsImRlbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBRUEsTUFBTUEsWUFBWSxHQUFHLE9BQU9DLFNBQVAsRUFBa0JDLE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ0MsSUFBbEMsRUFBd0NDLElBQXhDLEtBQWlEO0FBQ3BFLE1BQUksQ0FBQ0gsTUFBTCxFQUFhO0FBQ1hBLElBQUFBLE1BQU0sR0FBRyxFQUFUO0FBQ0Q7O0FBRUQsU0FBTyxDQUNMLE1BQU1JLGNBQUtDLE1BQUwsQ0FDSkosTUFESSxFQUVKQyxJQUZJLEVBR0pILFNBSEksRUFJSkMsTUFKSSxFQUtKRyxJQUFJLENBQUNHLFNBTEQsRUFNSkgsSUFBSSxDQUFDSSxPQU5ELENBREQsRUFTTEMsUUFURjtBQVVELENBZkQ7Ozs7QUFpQkEsTUFBTUMsWUFBWSxHQUFHLE9BQ25CVixTQURtQixFQUVuQlcsUUFGbUIsRUFHbkJWLE1BSG1CLEVBSW5CQyxNQUptQixFQUtuQkMsSUFMbUIsRUFNbkJDLElBTm1CLEtBT2hCO0FBQ0gsTUFBSSxDQUFDSCxNQUFMLEVBQWE7QUFDWEEsSUFBQUEsTUFBTSxHQUFHLEVBQVQ7QUFDRDs7QUFFRCxTQUFPLENBQ0wsTUFBTUksY0FBS08sTUFBTCxDQUNKVixNQURJLEVBRUpDLElBRkksRUFHSkgsU0FISSxFQUlKO0FBQUVXLElBQUFBO0FBQUYsR0FKSSxFQUtKVixNQUxJLEVBTUpHLElBQUksQ0FBQ0csU0FORCxFQU9KSCxJQUFJLENBQUNJLE9BUEQsQ0FERCxFQVVMQyxRQVZGO0FBV0QsQ0F2QkQ7Ozs7QUF5QkEsTUFBTUksWUFBWSxHQUFHLE9BQU9iLFNBQVAsRUFBa0JXLFFBQWxCLEVBQTRCVCxNQUE1QixFQUFvQ0MsSUFBcEMsRUFBMENDLElBQTFDLEtBQW1EO0FBQ3RFLFFBQU1DLGNBQUtTLEdBQUwsQ0FBU1osTUFBVCxFQUFpQkMsSUFBakIsRUFBdUJILFNBQXZCLEVBQWtDVyxRQUFsQyxFQUE0Q1AsSUFBSSxDQUFDSSxPQUFqRCxDQUFOO0FBQ0EsU0FBTyxJQUFQO0FBQ0QsQ0FIRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZXN0IGZyb20gJy4uLy4uL3Jlc3QnO1xuXG5jb25zdCBjcmVhdGVPYmplY3QgPSBhc3luYyAoY2xhc3NOYW1lLCBmaWVsZHMsIGNvbmZpZywgYXV0aCwgaW5mbykgPT4ge1xuICBpZiAoIWZpZWxkcykge1xuICAgIGZpZWxkcyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBhd2FpdCByZXN0LmNyZWF0ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBmaWVsZHMsXG4gICAgICBpbmZvLmNsaWVudFNESyxcbiAgICAgIGluZm8uY29udGV4dFxuICAgIClcbiAgKS5yZXNwb25zZTtcbn07XG5cbmNvbnN0IHVwZGF0ZU9iamVjdCA9IGFzeW5jIChcbiAgY2xhc3NOYW1lLFxuICBvYmplY3RJZCxcbiAgZmllbGRzLFxuICBjb25maWcsXG4gIGF1dGgsXG4gIGluZm9cbikgPT4ge1xuICBpZiAoIWZpZWxkcykge1xuICAgIGZpZWxkcyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBhd2FpdCByZXN0LnVwZGF0ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICB7IG9iamVjdElkIH0sXG4gICAgICBmaWVsZHMsXG4gICAgICBpbmZvLmNsaWVudFNESyxcbiAgICAgIGluZm8uY29udGV4dFxuICAgIClcbiAgKS5yZXNwb25zZTtcbn07XG5cbmNvbnN0IGRlbGV0ZU9iamVjdCA9IGFzeW5jIChjbGFzc05hbWUsIG9iamVjdElkLCBjb25maWcsIGF1dGgsIGluZm8pID0+IHtcbiAgYXdhaXQgcmVzdC5kZWwoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG9iamVjdElkLCBpbmZvLmNvbnRleHQpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZU9iamVjdCwgdXBkYXRlT2JqZWN0LCBkZWxldGVPYmplY3QgfTtcbiJdfQ==
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -55,7 +55,7 @@ const load = parseGraphQLSchema => {
|
||||
} = (0, _parseClassTypes.extractKeysAndInclude)(selectedFields);
|
||||
return _objectSpread({
|
||||
className: type
|
||||
}, (await objectsQueries.getObject(type, id, keys, include, undefined, undefined, config, auth, info, parseGraphQLSchema.parseClasses)));
|
||||
}, await objectsQueries.getObject(type, id, keys, include, undefined, undefined, config, auth, info, parseGraphQLSchema.parseClasses));
|
||||
} catch (e) {
|
||||
parseGraphQLSchema.handleError(e);
|
||||
}
|
||||
@@ -68,4 +68,4 @@ const load = parseGraphQLSchema => {
|
||||
};
|
||||
|
||||
exports.load = load;
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvZGVmYXVsdFJlbGF5U2NoZW1hLmpzIl0sIm5hbWVzIjpbIkdMT0JBTF9JRF9BVFQiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJkZWZhdWx0R3JhcGhRTFR5cGVzIiwiT0JKRUNUX0lEIiwibG9hZCIsInBhcnNlR3JhcGhRTFNjaGVtYSIsIm5vZGVJbnRlcmZhY2UiLCJub2RlRmllbGQiLCJnbG9iYWxJZCIsImNvbnRleHQiLCJxdWVyeUluZm8iLCJpZCIsImNvbmZpZyIsImF1dGgiLCJpbmZvIiwic2VsZWN0ZWRGaWVsZHMiLCJrZXlzIiwiaW5jbHVkZSIsImNsYXNzTmFtZSIsIm9iamVjdHNRdWVyaWVzIiwiZ2V0T2JqZWN0IiwidW5kZWZpbmVkIiwicGFyc2VDbGFzc2VzIiwiZSIsImhhbmRsZUVycm9yIiwib2JqIiwicGFyc2VDbGFzc1R5cGVzIiwiY2xhc3NHcmFwaFFMT3V0cHV0VHlwZSIsImFkZEdyYXBoUUxUeXBlIiwicmVsYXlOb2RlSW50ZXJmYWNlIiwiYWRkR3JhcGhRTFF1ZXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRUEsTUFBTUEsYUFBYSxHQUFHO0FBQ3BCQyxFQUFBQSxXQUFXLEVBQUUsd0JBRE87QUFFcEJDLEVBQUFBLElBQUksRUFBRUMsbUJBQW1CLENBQUNDO0FBRk4sQ0FBdEI7OztBQUtBLE1BQU1DLElBQUksR0FBR0Msa0JBQWtCLElBQUk7QUFDakMsUUFBTTtBQUFFQyxJQUFBQSxhQUFGO0FBQWlCQyxJQUFBQTtBQUFqQixNQUErQixtQ0FDbkMsT0FBT0MsUUFBUCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLEtBQXdDO0FBQ3RDLFFBQUk7QUFDRixZQUFNO0FBQUVULFFBQUFBLElBQUY7QUFBUVUsUUFBQUE7QUFBUixVQUFlLGdDQUFhSCxRQUFiLENBQXJCO0FBQ0EsWUFBTTtBQUFFSSxRQUFBQSxNQUFGO0FBQVVDLFFBQUFBLElBQVY7QUFBZ0JDLFFBQUFBO0FBQWhCLFVBQXlCTCxPQUEvQjtBQUNBLFlBQU1NLGNBQWMsR0FBRyxnQ0FBY0wsU0FBZCxDQUF2QjtBQUVBLFlBQU07QUFBRU0sUUFBQUEsSUFBRjtBQUFRQyxRQUFBQTtBQUFSLFVBQW9CLDRDQUFzQkYsY0FBdEIsQ0FBMUI7QUFFQTtBQUNFRyxRQUFBQSxTQUFTLEVBQUVqQjtBQURiLFVBRU0sTUFBTWtCLGNBQWMsQ0FBQ0MsU0FBZixDQUNSbkIsSUFEUSxFQUVSVSxFQUZRLEVBR1JLLElBSFEsRUFJUkMsT0FKUSxFQUtSSSxTQUxRLEVBTVJBLFNBTlEsRUFPUlQsTUFQUSxFQVFSQyxJQVJRLEVBU1JDLElBVFEsRUFVUlQsa0JBQWtCLENBQUNpQixZQVZYLENBRlo7QUFlRCxLQXRCRCxDQXNCRSxPQUFPQyxDQUFQLEVBQVU7QUFDVmxCLE1BQUFBLGtCQUFrQixDQUFDbUIsV0FBbkIsQ0FBK0JELENBQS9CO0FBQ0Q7QUFDRixHQTNCa0MsRUE0Qm5DRSxHQUFHLElBQUk7QUFDTCxXQUFPcEIsa0JBQWtCLENBQUNxQixlQUFuQixDQUFtQ0QsR0FBRyxDQUFDUCxTQUF2QyxFQUNKUyxzQkFESDtBQUVELEdBL0JrQyxDQUFyQztBQWtDQXRCLEVBQUFBLGtCQUFrQixDQUFDdUIsY0FBbkIsQ0FBa0N0QixhQUFsQyxFQUFpRCxJQUFqRDtBQUNBRCxFQUFBQSxrQkFBa0IsQ0FBQ3dCLGtCQUFuQixHQUF3Q3ZCLGFBQXhDO0FBQ0FELEVBQUFBLGtCQUFrQixDQUFDeUIsZUFBbkIsQ0FBbUMsTUFBbkMsRUFBMkN2QixTQUEzQyxFQUFzRCxJQUF0RDtBQUNELENBdENEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9kZURlZmluaXRpb25zLCBmcm9tR2xvYmFsSWQgfSBmcm9tICdncmFwaHFsLXJlbGF5JztcbmltcG9ydCBnZXRGaWVsZE5hbWVzIGZyb20gJ2dyYXBocWwtbGlzdC1maWVsZHMnO1xuaW1wb3J0ICogYXMgZGVmYXVsdEdyYXBoUUxUeXBlcyBmcm9tICcuL2RlZmF1bHRHcmFwaFFMVHlwZXMnO1xuaW1wb3J0ICogYXMgb2JqZWN0c1F1ZXJpZXMgZnJvbSAnLi4vaGVscGVycy9vYmplY3RzUXVlcmllcyc7XG5pbXBvcnQgeyBleHRyYWN0S2V5c0FuZEluY2x1ZGUgfSBmcm9tICcuL3BhcnNlQ2xhc3NUeXBlcyc7XG5cbmNvbnN0IEdMT0JBTF9JRF9BVFQgPSB7XG4gIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZ2xvYmFsIGlkLicsXG4gIHR5cGU6IGRlZmF1bHRHcmFwaFFMVHlwZXMuT0JKRUNUX0lELFxufTtcblxuY29uc3QgbG9hZCA9IHBhcnNlR3JhcGhRTFNjaGVtYSA9PiB7XG4gIGNvbnN0IHsgbm9kZUludGVyZmFjZSwgbm9kZUZpZWxkIH0gPSBub2RlRGVmaW5pdGlvbnMoXG4gICAgYXN5bmMgKGdsb2JhbElkLCBjb250ZXh0LCBxdWVyeUluZm8pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgaWQgfSA9IGZyb21HbG9iYWxJZChnbG9iYWxJZCk7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBpbmZvIH0gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZpZWxkcyA9IGdldEZpZWxkTmFtZXMocXVlcnlJbmZvKTtcblxuICAgICAgICBjb25zdCB7IGtleXMsIGluY2x1ZGUgfSA9IGV4dHJhY3RLZXlzQW5kSW5jbHVkZShzZWxlY3RlZEZpZWxkcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbGFzc05hbWU6IHR5cGUsXG4gICAgICAgICAgLi4uKGF3YWl0IG9iamVjdHNRdWVyaWVzLmdldE9iamVjdChcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGtleXMsXG4gICAgICAgICAgICBpbmNsdWRlLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEucGFyc2VDbGFzc2VzXG4gICAgICAgICAgKSksXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5oYW5kbGVFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9iaiA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VHcmFwaFFMU2NoZW1hLnBhcnNlQ2xhc3NUeXBlc1tvYmouY2xhc3NOYW1lXVxuICAgICAgICAuY2xhc3NHcmFwaFFMT3V0cHV0VHlwZTtcbiAgICB9XG4gICk7XG5cbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKG5vZGVJbnRlcmZhY2UsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEucmVsYXlOb2RlSW50ZXJmYWNlID0gbm9kZUludGVyZmFjZTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxRdWVyeSgnbm9kZScsIG5vZGVGaWVsZCwgdHJ1ZSk7XG59O1xuXG5leHBvcnQgeyBHTE9CQUxfSURfQVRULCBsb2FkIH07XG4iXX0=
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvZGVmYXVsdFJlbGF5U2NoZW1hLmpzIl0sIm5hbWVzIjpbIkdMT0JBTF9JRF9BVFQiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJkZWZhdWx0R3JhcGhRTFR5cGVzIiwiT0JKRUNUX0lEIiwibG9hZCIsInBhcnNlR3JhcGhRTFNjaGVtYSIsIm5vZGVJbnRlcmZhY2UiLCJub2RlRmllbGQiLCJnbG9iYWxJZCIsImNvbnRleHQiLCJxdWVyeUluZm8iLCJpZCIsImNvbmZpZyIsImF1dGgiLCJpbmZvIiwic2VsZWN0ZWRGaWVsZHMiLCJrZXlzIiwiaW5jbHVkZSIsImNsYXNzTmFtZSIsIm9iamVjdHNRdWVyaWVzIiwiZ2V0T2JqZWN0IiwidW5kZWZpbmVkIiwicGFyc2VDbGFzc2VzIiwiZSIsImhhbmRsZUVycm9yIiwib2JqIiwicGFyc2VDbGFzc1R5cGVzIiwiY2xhc3NHcmFwaFFMT3V0cHV0VHlwZSIsImFkZEdyYXBoUUxUeXBlIiwicmVsYXlOb2RlSW50ZXJmYWNlIiwiYWRkR3JhcGhRTFF1ZXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRUEsTUFBTUEsYUFBYSxHQUFHO0FBQ3BCQyxFQUFBQSxXQUFXLEVBQUUsd0JBRE87QUFFcEJDLEVBQUFBLElBQUksRUFBRUMsbUJBQW1CLENBQUNDO0FBRk4sQ0FBdEI7OztBQUtBLE1BQU1DLElBQUksR0FBR0Msa0JBQWtCLElBQUk7QUFDakMsUUFBTTtBQUFFQyxJQUFBQSxhQUFGO0FBQWlCQyxJQUFBQTtBQUFqQixNQUErQixtQ0FDbkMsT0FBT0MsUUFBUCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLEtBQXdDO0FBQ3RDLFFBQUk7QUFDRixZQUFNO0FBQUVULFFBQUFBLElBQUY7QUFBUVUsUUFBQUE7QUFBUixVQUFlLGdDQUFhSCxRQUFiLENBQXJCO0FBQ0EsWUFBTTtBQUFFSSxRQUFBQSxNQUFGO0FBQVVDLFFBQUFBLElBQVY7QUFBZ0JDLFFBQUFBO0FBQWhCLFVBQXlCTCxPQUEvQjtBQUNBLFlBQU1NLGNBQWMsR0FBRyxnQ0FBY0wsU0FBZCxDQUF2QjtBQUVBLFlBQU07QUFBRU0sUUFBQUEsSUFBRjtBQUFRQyxRQUFBQTtBQUFSLFVBQW9CLDRDQUFzQkYsY0FBdEIsQ0FBMUI7QUFFQTtBQUNFRyxRQUFBQSxTQUFTLEVBQUVqQjtBQURiLFNBRU0sTUFBTWtCLGNBQWMsQ0FBQ0MsU0FBZixDQUNSbkIsSUFEUSxFQUVSVSxFQUZRLEVBR1JLLElBSFEsRUFJUkMsT0FKUSxFQUtSSSxTQUxRLEVBTVJBLFNBTlEsRUFPUlQsTUFQUSxFQVFSQyxJQVJRLEVBU1JDLElBVFEsRUFVUlQsa0JBQWtCLENBQUNpQixZQVZYLENBRlo7QUFlRCxLQXRCRCxDQXNCRSxPQUFPQyxDQUFQLEVBQVU7QUFDVmxCLE1BQUFBLGtCQUFrQixDQUFDbUIsV0FBbkIsQ0FBK0JELENBQS9CO0FBQ0Q7QUFDRixHQTNCa0MsRUE0Qm5DRSxHQUFHLElBQUk7QUFDTCxXQUFPcEIsa0JBQWtCLENBQUNxQixlQUFuQixDQUFtQ0QsR0FBRyxDQUFDUCxTQUF2QyxFQUNKUyxzQkFESDtBQUVELEdBL0JrQyxDQUFyQztBQWtDQXRCLEVBQUFBLGtCQUFrQixDQUFDdUIsY0FBbkIsQ0FBa0N0QixhQUFsQyxFQUFpRCxJQUFqRDtBQUNBRCxFQUFBQSxrQkFBa0IsQ0FBQ3dCLGtCQUFuQixHQUF3Q3ZCLGFBQXhDO0FBQ0FELEVBQUFBLGtCQUFrQixDQUFDeUIsZUFBbkIsQ0FBbUMsTUFBbkMsRUFBMkN2QixTQUEzQyxFQUFzRCxJQUF0RDtBQUNELENBdENEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9kZURlZmluaXRpb25zLCBmcm9tR2xvYmFsSWQgfSBmcm9tICdncmFwaHFsLXJlbGF5JztcbmltcG9ydCBnZXRGaWVsZE5hbWVzIGZyb20gJ2dyYXBocWwtbGlzdC1maWVsZHMnO1xuaW1wb3J0ICogYXMgZGVmYXVsdEdyYXBoUUxUeXBlcyBmcm9tICcuL2RlZmF1bHRHcmFwaFFMVHlwZXMnO1xuaW1wb3J0ICogYXMgb2JqZWN0c1F1ZXJpZXMgZnJvbSAnLi4vaGVscGVycy9vYmplY3RzUXVlcmllcyc7XG5pbXBvcnQgeyBleHRyYWN0S2V5c0FuZEluY2x1ZGUgfSBmcm9tICcuL3BhcnNlQ2xhc3NUeXBlcyc7XG5cbmNvbnN0IEdMT0JBTF9JRF9BVFQgPSB7XG4gIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZ2xvYmFsIGlkLicsXG4gIHR5cGU6IGRlZmF1bHRHcmFwaFFMVHlwZXMuT0JKRUNUX0lELFxufTtcblxuY29uc3QgbG9hZCA9IHBhcnNlR3JhcGhRTFNjaGVtYSA9PiB7XG4gIGNvbnN0IHsgbm9kZUludGVyZmFjZSwgbm9kZUZpZWxkIH0gPSBub2RlRGVmaW5pdGlvbnMoXG4gICAgYXN5bmMgKGdsb2JhbElkLCBjb250ZXh0LCBxdWVyeUluZm8pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgaWQgfSA9IGZyb21HbG9iYWxJZChnbG9iYWxJZCk7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBpbmZvIH0gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZpZWxkcyA9IGdldEZpZWxkTmFtZXMocXVlcnlJbmZvKTtcblxuICAgICAgICBjb25zdCB7IGtleXMsIGluY2x1ZGUgfSA9IGV4dHJhY3RLZXlzQW5kSW5jbHVkZShzZWxlY3RlZEZpZWxkcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbGFzc05hbWU6IHR5cGUsXG4gICAgICAgICAgLi4uKGF3YWl0IG9iamVjdHNRdWVyaWVzLmdldE9iamVjdChcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGtleXMsXG4gICAgICAgICAgICBpbmNsdWRlLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEucGFyc2VDbGFzc2VzXG4gICAgICAgICAgKSksXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5oYW5kbGVFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9iaiA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VHcmFwaFFMU2NoZW1hLnBhcnNlQ2xhc3NUeXBlc1tvYmouY2xhc3NOYW1lXVxuICAgICAgICAuY2xhc3NHcmFwaFFMT3V0cHV0VHlwZTtcbiAgICB9XG4gICk7XG5cbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKG5vZGVJbnRlcmZhY2UsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEucmVsYXlOb2RlSW50ZXJmYWNlID0gbm9kZUludGVyZmFjZTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxRdWVyeSgnbm9kZScsIG5vZGVGaWVsZCwgdHJ1ZSk7XG59O1xuXG5leHBvcnQgeyBHTE9CQUxfSURfQVRULCBsb2FkIH07XG4iXX0=
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -7,7 +7,7 @@ exports.load = exports.definitions = void 0;
|
||||
|
||||
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
||||
|
||||
var _graphqlTools = require("graphql-tools");
|
||||
var _utils = require("@graphql-tools/utils");
|
||||
|
||||
var _FunctionsRouter = require("../../Routers/FunctionsRouter");
|
||||
|
||||
@@ -22,7 +22,7 @@ exports.definitions = definitions;
|
||||
const load = parseGraphQLSchema => {
|
||||
parseGraphQLSchema.graphQLSchemaDirectivesDefinitions = definitions;
|
||||
|
||||
class ResolveDirectiveVisitor extends _graphqlTools.SchemaDirectiveVisitor {
|
||||
class ResolveDirectiveVisitor extends _utils.SchemaDirectiveVisitor {
|
||||
visitFieldDefinition(field) {
|
||||
field.resolve = async (_source, args, context) => {
|
||||
try {
|
||||
@@ -56,7 +56,7 @@ const load = parseGraphQLSchema => {
|
||||
|
||||
parseGraphQLSchema.graphQLSchemaDirectives.resolve = ResolveDirectiveVisitor;
|
||||
|
||||
class MockDirectiveVisitor extends _graphqlTools.SchemaDirectiveVisitor {
|
||||
class MockDirectiveVisitor extends _utils.SchemaDirectiveVisitor {
|
||||
visitFieldDefinition(field) {
|
||||
field.resolve = () => {
|
||||
return this.args.with;
|
||||
@@ -69,4 +69,4 @@ const load = parseGraphQLSchema => {
|
||||
};
|
||||
|
||||
exports.load = load;
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvc2NoZW1hRGlyZWN0aXZlcy5qcyJdLCJuYW1lcyI6WyJkZWZpbml0aW9ucyIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJncmFwaFFMU2NoZW1hRGlyZWN0aXZlc0RlZmluaXRpb25zIiwiUmVzb2x2ZURpcmVjdGl2ZVZpc2l0b3IiLCJTY2hlbWFEaXJlY3RpdmVWaXNpdG9yIiwidmlzaXRGaWVsZERlZmluaXRpb24iLCJmaWVsZCIsInJlc29sdmUiLCJfc291cmNlIiwiYXJncyIsImNvbnRleHQiLCJjb25maWciLCJhdXRoIiwiaW5mbyIsImZ1bmN0aW9uTmFtZSIsIm5hbWUiLCJ0byIsIkZ1bmN0aW9uc1JvdXRlciIsImhhbmRsZUNsb3VkRnVuY3Rpb24iLCJwYXJhbXMiLCJib2R5IiwicmVzcG9uc2UiLCJyZXN1bHQiLCJlIiwiaGFuZGxlRXJyb3IiLCJncmFwaFFMU2NoZW1hRGlyZWN0aXZlcyIsIk1vY2tEaXJlY3RpdmVWaXNpdG9yIiwid2l0aCIsIm1vY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7OztBQUVPLE1BQU1BLFdBQVcsR0FBRyx3QkFBSTs7O0NBQXhCOzs7QUFLUCxNQUFNQyxJQUFJLEdBQUdDLGtCQUFrQixJQUFJO0FBQ2pDQSxFQUFBQSxrQkFBa0IsQ0FBQ0Msa0NBQW5CLEdBQXdESCxXQUF4RDs7QUFFQSxRQUFNSSx1QkFBTixTQUFzQ0Msb0NBQXRDLENBQTZEO0FBQzNEQyxJQUFBQSxvQkFBb0IsQ0FBQ0MsS0FBRCxFQUFRO0FBQzFCQSxNQUFBQSxLQUFLLENBQUNDLE9BQU4sR0FBZ0IsT0FBT0MsT0FBUCxFQUFnQkMsSUFBaEIsRUFBc0JDLE9BQXRCLEtBQWtDO0FBQ2hELFlBQUk7QUFDRixnQkFBTTtBQUFFQyxZQUFBQSxNQUFGO0FBQVVDLFlBQUFBLElBQVY7QUFBZ0JDLFlBQUFBO0FBQWhCLGNBQXlCSCxPQUEvQjtBQUVBLGNBQUlJLFlBQVksR0FBR1IsS0FBSyxDQUFDUyxJQUF6Qjs7QUFDQSxjQUFJLEtBQUtOLElBQUwsQ0FBVU8sRUFBZCxFQUFrQjtBQUNoQkYsWUFBQUEsWUFBWSxHQUFHLEtBQUtMLElBQUwsQ0FBVU8sRUFBekI7QUFDRDs7QUFFRCxpQkFBTyxDQUFDLE1BQU1DLGlDQUFnQkMsbUJBQWhCLENBQW9DO0FBQ2hEQyxZQUFBQSxNQUFNLEVBQUU7QUFDTkwsY0FBQUE7QUFETSxhQUR3QztBQUloREgsWUFBQUEsTUFKZ0Q7QUFLaERDLFlBQUFBLElBTGdEO0FBTWhEQyxZQUFBQSxJQU5nRDtBQU9oRE8sWUFBQUEsSUFBSSxFQUFFWDtBQVAwQyxXQUFwQyxDQUFQLEVBUUhZLFFBUkcsQ0FRTUMsTUFSYjtBQVNELFNBakJELENBaUJFLE9BQU9DLENBQVAsRUFBVTtBQUNWdEIsVUFBQUEsa0JBQWtCLENBQUN1QixXQUFuQixDQUErQkQsQ0FBL0I7QUFDRDtBQUNGLE9BckJEO0FBc0JEOztBQXhCMEQ7O0FBMkI3RHRCLEVBQUFBLGtCQUFrQixDQUFDd0IsdUJBQW5CLENBQTJDbEIsT0FBM0MsR0FBcURKLHVCQUFyRDs7QUFFQSxRQUFNdUIsb0JBQU4sU0FBbUN0QixvQ0FBbkMsQ0FBMEQ7QUFDeERDLElBQUFBLG9CQUFvQixDQUFDQyxLQUFELEVBQVE7QUFDMUJBLE1BQUFBLEtBQUssQ0FBQ0MsT0FBTixHQUFnQixNQUFNO0FBQ3BCLGVBQU8sS0FBS0UsSUFBTCxDQUFVa0IsSUFBakI7QUFDRCxPQUZEO0FBR0Q7O0FBTHVEOztBQVExRDFCLEVBQUFBLGtCQUFrQixDQUFDd0IsdUJBQW5CLENBQTJDRyxJQUEzQyxHQUFrREYsb0JBQWxEO0FBQ0QsQ0F6Q0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJztcbmltcG9ydCB7IFNjaGVtYURpcmVjdGl2ZVZpc2l0b3IgfSBmcm9tICdncmFwaHFsLXRvb2xzJztcbmltcG9ydCB7IEZ1bmN0aW9uc1JvdXRlciB9IGZyb20gJy4uLy4uL1JvdXRlcnMvRnVuY3Rpb25zUm91dGVyJztcblxuZXhwb3J0IGNvbnN0IGRlZmluaXRpb25zID0gZ3FsYFxuICBkaXJlY3RpdmUgQHJlc29sdmUodG86IFN0cmluZykgb24gRklFTERfREVGSU5JVElPTlxuICBkaXJlY3RpdmUgQG1vY2sod2l0aDogQW55ISkgb24gRklFTERfREVGSU5JVElPTlxuYDtcblxuY29uc3QgbG9hZCA9IHBhcnNlR3JhcGhRTFNjaGVtYSA9PiB7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5ncmFwaFFMU2NoZW1hRGlyZWN0aXZlc0RlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG5cbiAgY2xhc3MgUmVzb2x2ZURpcmVjdGl2ZVZpc2l0b3IgZXh0ZW5kcyBTY2hlbWFEaXJlY3RpdmVWaXNpdG9yIHtcbiAgICB2aXNpdEZpZWxkRGVmaW5pdGlvbihmaWVsZCkge1xuICAgICAgZmllbGQucmVzb2x2ZSA9IGFzeW5jIChfc291cmNlLCBhcmdzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBjb25maWcsIGF1dGgsIGluZm8gfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgICBsZXQgZnVuY3Rpb25OYW1lID0gZmllbGQubmFtZTtcbiAgICAgICAgICBpZiAodGhpcy5hcmdzLnRvKSB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWUgPSB0aGlzLmFyZ3MudG87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBGdW5jdGlvbnNSb3V0ZXIuaGFuZGxlQ2xvdWRGdW5jdGlvbih7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICBpbmZvLFxuICAgICAgICAgICAgYm9keTogYXJncyxcbiAgICAgICAgICB9KSkucmVzcG9uc2UucmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5ncmFwaFFMU2NoZW1hRGlyZWN0aXZlcy5yZXNvbHZlID0gUmVzb2x2ZURpcmVjdGl2ZVZpc2l0b3I7XG5cbiAgY2xhc3MgTW9ja0RpcmVjdGl2ZVZpc2l0b3IgZXh0ZW5kcyBTY2hlbWFEaXJlY3RpdmVWaXNpdG9yIHtcbiAgICB2aXNpdEZpZWxkRGVmaW5pdGlvbihmaWVsZCkge1xuICAgICAgZmllbGQucmVzb2x2ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy53aXRoO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUdyYXBoUUxTY2hlbWEuZ3JhcGhRTFNjaGVtYURpcmVjdGl2ZXMubW9jayA9IE1vY2tEaXJlY3RpdmVWaXNpdG9yO1xufTtcblxuZXhwb3J0IHsgbG9hZCB9O1xuIl19
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvc2NoZW1hRGlyZWN0aXZlcy5qcyJdLCJuYW1lcyI6WyJkZWZpbml0aW9ucyIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJncmFwaFFMU2NoZW1hRGlyZWN0aXZlc0RlZmluaXRpb25zIiwiUmVzb2x2ZURpcmVjdGl2ZVZpc2l0b3IiLCJTY2hlbWFEaXJlY3RpdmVWaXNpdG9yIiwidmlzaXRGaWVsZERlZmluaXRpb24iLCJmaWVsZCIsInJlc29sdmUiLCJfc291cmNlIiwiYXJncyIsImNvbnRleHQiLCJjb25maWciLCJhdXRoIiwiaW5mbyIsImZ1bmN0aW9uTmFtZSIsIm5hbWUiLCJ0byIsIkZ1bmN0aW9uc1JvdXRlciIsImhhbmRsZUNsb3VkRnVuY3Rpb24iLCJwYXJhbXMiLCJib2R5IiwicmVzcG9uc2UiLCJyZXN1bHQiLCJlIiwiaGFuZGxlRXJyb3IiLCJncmFwaFFMU2NoZW1hRGlyZWN0aXZlcyIsIk1vY2tEaXJlY3RpdmVWaXNpdG9yIiwid2l0aCIsIm1vY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7OztBQUVPLE1BQU1BLFdBQVcsR0FBRyx3QkFBSTs7O0NBQXhCOzs7QUFLUCxNQUFNQyxJQUFJLEdBQUlDLGtCQUFELElBQXdCO0FBQ25DQSxFQUFBQSxrQkFBa0IsQ0FBQ0Msa0NBQW5CLEdBQXdESCxXQUF4RDs7QUFFQSxRQUFNSSx1QkFBTixTQUFzQ0MsNkJBQXRDLENBQTZEO0FBQzNEQyxJQUFBQSxvQkFBb0IsQ0FBQ0MsS0FBRCxFQUFRO0FBQzFCQSxNQUFBQSxLQUFLLENBQUNDLE9BQU4sR0FBZ0IsT0FBT0MsT0FBUCxFQUFnQkMsSUFBaEIsRUFBc0JDLE9BQXRCLEtBQWtDO0FBQ2hELFlBQUk7QUFDRixnQkFBTTtBQUFFQyxZQUFBQSxNQUFGO0FBQVVDLFlBQUFBLElBQVY7QUFBZ0JDLFlBQUFBO0FBQWhCLGNBQXlCSCxPQUEvQjtBQUVBLGNBQUlJLFlBQVksR0FBR1IsS0FBSyxDQUFDUyxJQUF6Qjs7QUFDQSxjQUFJLEtBQUtOLElBQUwsQ0FBVU8sRUFBZCxFQUFrQjtBQUNoQkYsWUFBQUEsWUFBWSxHQUFHLEtBQUtMLElBQUwsQ0FBVU8sRUFBekI7QUFDRDs7QUFFRCxpQkFBTyxDQUNMLE1BQU1DLGlDQUFnQkMsbUJBQWhCLENBQW9DO0FBQ3hDQyxZQUFBQSxNQUFNLEVBQUU7QUFDTkwsY0FBQUE7QUFETSxhQURnQztBQUl4Q0gsWUFBQUEsTUFKd0M7QUFLeENDLFlBQUFBLElBTHdDO0FBTXhDQyxZQUFBQSxJQU53QztBQU94Q08sWUFBQUEsSUFBSSxFQUFFWDtBQVBrQyxXQUFwQyxDQURELEVBVUxZLFFBVkssQ0FVSUMsTUFWWDtBQVdELFNBbkJELENBbUJFLE9BQU9DLENBQVAsRUFBVTtBQUNWdEIsVUFBQUEsa0JBQWtCLENBQUN1QixXQUFuQixDQUErQkQsQ0FBL0I7QUFDRDtBQUNGLE9BdkJEO0FBd0JEOztBQTFCMEQ7O0FBNkI3RHRCLEVBQUFBLGtCQUFrQixDQUFDd0IsdUJBQW5CLENBQTJDbEIsT0FBM0MsR0FBcURKLHVCQUFyRDs7QUFFQSxRQUFNdUIsb0JBQU4sU0FBbUN0Qiw2QkFBbkMsQ0FBMEQ7QUFDeERDLElBQUFBLG9CQUFvQixDQUFDQyxLQUFELEVBQVE7QUFDMUJBLE1BQUFBLEtBQUssQ0FBQ0MsT0FBTixHQUFnQixNQUFNO0FBQ3BCLGVBQU8sS0FBS0UsSUFBTCxDQUFVa0IsSUFBakI7QUFDRCxPQUZEO0FBR0Q7O0FBTHVEOztBQVExRDFCLEVBQUFBLGtCQUFrQixDQUFDd0IsdUJBQW5CLENBQTJDRyxJQUEzQyxHQUFrREYsb0JBQWxEO0FBQ0QsQ0EzQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJztcbmltcG9ydCB7IFNjaGVtYURpcmVjdGl2ZVZpc2l0b3IgfSBmcm9tICdAZ3JhcGhxbC10b29scy91dGlscyc7XG5pbXBvcnQgeyBGdW5jdGlvbnNSb3V0ZXIgfSBmcm9tICcuLi8uLi9Sb3V0ZXJzL0Z1bmN0aW9uc1JvdXRlcic7XG5cbmV4cG9ydCBjb25zdCBkZWZpbml0aW9ucyA9IGdxbGBcbiAgZGlyZWN0aXZlIEByZXNvbHZlKHRvOiBTdHJpbmcpIG9uIEZJRUxEX0RFRklOSVRJT05cbiAgZGlyZWN0aXZlIEBtb2NrKHdpdGg6IEFueSEpIG9uIEZJRUxEX0RFRklOSVRJT05cbmA7XG5cbmNvbnN0IGxvYWQgPSAocGFyc2VHcmFwaFFMU2NoZW1hKSA9PiB7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5ncmFwaFFMU2NoZW1hRGlyZWN0aXZlc0RlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG5cbiAgY2xhc3MgUmVzb2x2ZURpcmVjdGl2ZVZpc2l0b3IgZXh0ZW5kcyBTY2hlbWFEaXJlY3RpdmVWaXNpdG9yIHtcbiAgICB2aXNpdEZpZWxkRGVmaW5pdGlvbihmaWVsZCkge1xuICAgICAgZmllbGQucmVzb2x2ZSA9IGFzeW5jIChfc291cmNlLCBhcmdzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBjb25maWcsIGF1dGgsIGluZm8gfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgICBsZXQgZnVuY3Rpb25OYW1lID0gZmllbGQubmFtZTtcbiAgICAgICAgICBpZiAodGhpcy5hcmdzLnRvKSB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWUgPSB0aGlzLmFyZ3MudG87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGF3YWl0IEZ1bmN0aW9uc1JvdXRlci5oYW5kbGVDbG91ZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICAgIGJvZHk6IGFyZ3MsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkucmVzcG9uc2UucmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5ncmFwaFFMU2NoZW1hRGlyZWN0aXZlcy5yZXNvbHZlID0gUmVzb2x2ZURpcmVjdGl2ZVZpc2l0b3I7XG5cbiAgY2xhc3MgTW9ja0RpcmVjdGl2ZVZpc2l0b3IgZXh0ZW5kcyBTY2hlbWFEaXJlY3RpdmVWaXNpdG9yIHtcbiAgICB2aXNpdEZpZWxkRGVmaW5pdGlvbihmaWVsZCkge1xuICAgICAgZmllbGQucmVzb2x2ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy53aXRoO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUdyYXBoUUxTY2hlbWEuZ3JhcGhRTFNjaGVtYURpcmVjdGl2ZXMubW9jayA9IE1vY2tEaXJlY3RpdmVWaXNpdG9yO1xufTtcblxuZXhwb3J0IHsgbG9hZCB9O1xuIl19
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -46,4 +46,4 @@ ParsePubSub.createSubscriber = function (config) {
|
||||
return adapter.createSubscriber(config);
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvUGFyc2VQdWJTdWIuanMiXSwibmFtZXMiOlsiUGFyc2VQdWJTdWIiLCJ1c2VSZWRpcyIsImNvbmZpZyIsInJlZGlzVVJMIiwiY3JlYXRlUHVibGlzaGVyIiwiUmVkaXNQdWJTdWIiLCJhZGFwdGVyIiwicHViU3ViQWRhcHRlciIsIkV2ZW50RW1pdHRlclB1YlN1YiIsImNyZWF0ZVN1YnNjcmliZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsRUFBcEI7OztBQUVBLFNBQVNDLFFBQVQsQ0FBa0JDLE1BQWxCLEVBQXdDO0FBQ3RDLFFBQU1DLFFBQVEsR0FBR0QsTUFBTSxDQUFDQyxRQUF4QjtBQUNBLFNBQU8sT0FBT0EsUUFBUCxLQUFvQixXQUFwQixJQUFtQ0EsUUFBUSxLQUFLLEVBQXZEO0FBQ0Q7O0FBRURILFdBQVcsQ0FBQ0ksZUFBWixHQUE4QixVQUFTRixNQUFULEVBQTJCO0FBQ3ZELE1BQUlELFFBQVEsQ0FBQ0MsTUFBRCxDQUFaLEVBQXNCO0FBQ3BCLFdBQU9HLHlCQUFZRCxlQUFaLENBQTRCRixNQUE1QixDQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsVUFBTUksT0FBTyxHQUFHLGdDQUNkSixNQUFNLENBQUNLLGFBRE8sRUFFZEMsc0NBRmMsRUFHZE4sTUFIYyxDQUFoQjs7QUFLQSxRQUFJLE9BQU9JLE9BQU8sQ0FBQ0YsZUFBZixLQUFtQyxVQUF2QyxFQUFtRDtBQUNqRCxZQUFNLDZDQUFOO0FBQ0Q7O0FBQ0QsV0FBT0UsT0FBTyxDQUFDRixlQUFSLENBQXdCRixNQUF4QixDQUFQO0FBQ0Q7QUFDRixDQWREOztBQWdCQUYsV0FBVyxDQUFDUyxnQkFBWixHQUErQixVQUFTUCxNQUFULEVBQTRCO0FBQ3pELE1BQUlELFFBQVEsQ0FBQ0MsTUFBRCxDQUFaLEVBQXNCO0FBQ3BCLFdBQU9HLHlCQUFZSSxnQkFBWixDQUE2QlAsTUFBN0IsQ0FBUDtBQUNELEdBRkQsTUFFTztBQUNMLFVBQU1JLE9BQU8sR0FBRyxnQ0FDZEosTUFBTSxDQUFDSyxhQURPLEVBRWRDLHNDQUZjLEVBR2ROLE1BSGMsQ0FBaEI7O0FBS0EsUUFBSSxPQUFPSSxPQUFPLENBQUNHLGdCQUFmLEtBQW9DLFVBQXhDLEVBQW9EO0FBQ2xELFlBQU0sOENBQU47QUFDRDs7QUFDRCxXQUFPSCxPQUFPLENBQUNHLGdCQUFSLENBQXlCUCxNQUF6QixDQUFQO0FBQ0Q7QUFDRixDQWREIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZEFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9BZGFwdGVyTG9hZGVyJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlclB1YlN1YiB9IGZyb20gJy4uL0FkYXB0ZXJzL1B1YlN1Yi9FdmVudEVtaXR0ZXJQdWJTdWInO1xuXG5pbXBvcnQgeyBSZWRpc1B1YlN1YiB9IGZyb20gJy4uL0FkYXB0ZXJzL1B1YlN1Yi9SZWRpc1B1YlN1Yic7XG5cbmNvbnN0IFBhcnNlUHViU3ViID0ge307XG5cbmZ1bmN0aW9uIHVzZVJlZGlzKGNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlZGlzVVJMID0gY29uZmlnLnJlZGlzVVJMO1xuICByZXR1cm4gdHlwZW9mIHJlZGlzVVJMICE9PSAndW5kZWZpbmVkJyAmJiByZWRpc1VSTCAhPT0gJyc7XG59XG5cblBhcnNlUHViU3ViLmNyZWF0ZVB1Ymxpc2hlciA9IGZ1bmN0aW9uKGNvbmZpZzogYW55KTogYW55IHtcbiAgaWYgKHVzZVJlZGlzKGNvbmZpZykpIHtcbiAgICByZXR1cm4gUmVkaXNQdWJTdWIuY3JlYXRlUHVibGlzaGVyKGNvbmZpZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWRhcHRlciA9IGxvYWRBZGFwdGVyKFxuICAgICAgY29uZmlnLnB1YlN1YkFkYXB0ZXIsXG4gICAgICBFdmVudEVtaXR0ZXJQdWJTdWIsXG4gICAgICBjb25maWdcbiAgICApO1xuICAgIGlmICh0eXBlb2YgYWRhcHRlci5jcmVhdGVQdWJsaXNoZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93ICdwdWJTdWJBZGFwdGVyIHNob3VsZCBoYXZlIGNyZWF0ZVB1Ymxpc2hlcigpJztcbiAgICB9XG4gICAgcmV0dXJuIGFkYXB0ZXIuY3JlYXRlUHVibGlzaGVyKGNvbmZpZyk7XG4gIH1cbn07XG5cblBhcnNlUHViU3ViLmNyZWF0ZVN1YnNjcmliZXIgPSBmdW5jdGlvbihjb25maWc6IGFueSk6IHZvaWQge1xuICBpZiAodXNlUmVkaXMoY29uZmlnKSkge1xuICAgIHJldHVybiBSZWRpc1B1YlN1Yi5jcmVhdGVTdWJzY3JpYmVyKGNvbmZpZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWRhcHRlciA9IGxvYWRBZGFwdGVyKFxuICAgICAgY29uZmlnLnB1YlN1YkFkYXB0ZXIsXG4gICAgICBFdmVudEVtaXR0ZXJQdWJTdWIsXG4gICAgICBjb25maWdcbiAgICApO1xuICAgIGlmICh0eXBlb2YgYWRhcHRlci5jcmVhdGVTdWJzY3JpYmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyAncHViU3ViQWRhcHRlciBzaG91bGQgaGF2ZSBjcmVhdGVTdWJzY3JpYmVyKCknO1xuICAgIH1cbiAgICByZXR1cm4gYWRhcHRlci5jcmVhdGVTdWJzY3JpYmVyKGNvbmZpZyk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IFBhcnNlUHViU3ViIH07XG4iXX0=
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvUGFyc2VQdWJTdWIuanMiXSwibmFtZXMiOlsiUGFyc2VQdWJTdWIiLCJ1c2VSZWRpcyIsImNvbmZpZyIsInJlZGlzVVJMIiwiY3JlYXRlUHVibGlzaGVyIiwiUmVkaXNQdWJTdWIiLCJhZGFwdGVyIiwicHViU3ViQWRhcHRlciIsIkV2ZW50RW1pdHRlclB1YlN1YiIsImNyZWF0ZVN1YnNjcmliZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsRUFBcEI7OztBQUVBLFNBQVNDLFFBQVQsQ0FBa0JDLE1BQWxCLEVBQXdDO0FBQ3RDLFFBQU1DLFFBQVEsR0FBR0QsTUFBTSxDQUFDQyxRQUF4QjtBQUNBLFNBQU8sT0FBT0EsUUFBUCxLQUFvQixXQUFwQixJQUFtQ0EsUUFBUSxLQUFLLEVBQXZEO0FBQ0Q7O0FBRURILFdBQVcsQ0FBQ0ksZUFBWixHQUE4QixVQUFVRixNQUFWLEVBQTRCO0FBQ3hELE1BQUlELFFBQVEsQ0FBQ0MsTUFBRCxDQUFaLEVBQXNCO0FBQ3BCLFdBQU9HLHlCQUFZRCxlQUFaLENBQTRCRixNQUE1QixDQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsVUFBTUksT0FBTyxHQUFHLGdDQUNkSixNQUFNLENBQUNLLGFBRE8sRUFFZEMsc0NBRmMsRUFHZE4sTUFIYyxDQUFoQjs7QUFLQSxRQUFJLE9BQU9JLE9BQU8sQ0FBQ0YsZUFBZixLQUFtQyxVQUF2QyxFQUFtRDtBQUNqRCxZQUFNLDZDQUFOO0FBQ0Q7O0FBQ0QsV0FBT0UsT0FBTyxDQUFDRixlQUFSLENBQXdCRixNQUF4QixDQUFQO0FBQ0Q7QUFDRixDQWREOztBQWdCQUYsV0FBVyxDQUFDUyxnQkFBWixHQUErQixVQUFVUCxNQUFWLEVBQTZCO0FBQzFELE1BQUlELFFBQVEsQ0FBQ0MsTUFBRCxDQUFaLEVBQXNCO0FBQ3BCLFdBQU9HLHlCQUFZSSxnQkFBWixDQUE2QlAsTUFBN0IsQ0FBUDtBQUNELEdBRkQsTUFFTztBQUNMLFVBQU1JLE9BQU8sR0FBRyxnQ0FDZEosTUFBTSxDQUFDSyxhQURPLEVBRWRDLHNDQUZjLEVBR2ROLE1BSGMsQ0FBaEI7O0FBS0EsUUFBSSxPQUFPSSxPQUFPLENBQUNHLGdCQUFmLEtBQW9DLFVBQXhDLEVBQW9EO0FBQ2xELFlBQU0sOENBQU47QUFDRDs7QUFDRCxXQUFPSCxPQUFPLENBQUNHLGdCQUFSLENBQXlCUCxNQUF6QixDQUFQO0FBQ0Q7QUFDRixDQWREIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZEFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9BZGFwdGVyTG9hZGVyJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlclB1YlN1YiB9IGZyb20gJy4uL0FkYXB0ZXJzL1B1YlN1Yi9FdmVudEVtaXR0ZXJQdWJTdWInO1xuXG5pbXBvcnQgeyBSZWRpc1B1YlN1YiB9IGZyb20gJy4uL0FkYXB0ZXJzL1B1YlN1Yi9SZWRpc1B1YlN1Yic7XG5cbmNvbnN0IFBhcnNlUHViU3ViID0ge307XG5cbmZ1bmN0aW9uIHVzZVJlZGlzKGNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlZGlzVVJMID0gY29uZmlnLnJlZGlzVVJMO1xuICByZXR1cm4gdHlwZW9mIHJlZGlzVVJMICE9PSAndW5kZWZpbmVkJyAmJiByZWRpc1VSTCAhPT0gJyc7XG59XG5cblBhcnNlUHViU3ViLmNyZWF0ZVB1Ymxpc2hlciA9IGZ1bmN0aW9uIChjb25maWc6IGFueSk6IGFueSB7XG4gIGlmICh1c2VSZWRpcyhjb25maWcpKSB7XG4gICAgcmV0dXJuIFJlZGlzUHViU3ViLmNyZWF0ZVB1Ymxpc2hlcihjb25maWcpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSBsb2FkQWRhcHRlcihcbiAgICAgIGNvbmZpZy5wdWJTdWJBZGFwdGVyLFxuICAgICAgRXZlbnRFbWl0dGVyUHViU3ViLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIuY3JlYXRlUHVibGlzaGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyAncHViU3ViQWRhcHRlciBzaG91bGQgaGF2ZSBjcmVhdGVQdWJsaXNoZXIoKSc7XG4gICAgfVxuICAgIHJldHVybiBhZGFwdGVyLmNyZWF0ZVB1Ymxpc2hlcihjb25maWcpO1xuICB9XG59O1xuXG5QYXJzZVB1YlN1Yi5jcmVhdGVTdWJzY3JpYmVyID0gZnVuY3Rpb24gKGNvbmZpZzogYW55KTogdm9pZCB7XG4gIGlmICh1c2VSZWRpcyhjb25maWcpKSB7XG4gICAgcmV0dXJuIFJlZGlzUHViU3ViLmNyZWF0ZVN1YnNjcmliZXIoY29uZmlnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhZGFwdGVyID0gbG9hZEFkYXB0ZXIoXG4gICAgICBjb25maWcucHViU3ViQWRhcHRlcixcbiAgICAgIEV2ZW50RW1pdHRlclB1YlN1YixcbiAgICAgIGNvbmZpZ1xuICAgICk7XG4gICAgaWYgKHR5cGVvZiBhZGFwdGVyLmNyZWF0ZVN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93ICdwdWJTdWJBZGFwdGVyIHNob3VsZCBoYXZlIGNyZWF0ZVN1YnNjcmliZXIoKSc7XG4gICAgfVxuICAgIHJldHVybiBhZGFwdGVyLmNyZWF0ZVN1YnNjcmliZXIoY29uZmlnKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgUGFyc2VQdWJTdWIgfTtcbiJdfQ==
|
||||
File diff suppressed because one or more lines are too long
@@ -64,4 +64,4 @@ class SessionTokenCache {
|
||||
}
|
||||
|
||||
exports.SessionTokenCache = SessionTokenCache;
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvU2Vzc2lvblRva2VuQ2FjaGUuanMiXSwibmFtZXMiOlsidXNlckZvclNlc3Npb25Ub2tlbiIsInNlc3Npb25Ub2tlbiIsInEiLCJQYXJzZSIsIlF1ZXJ5IiwiZXF1YWxUbyIsImZpcnN0IiwidXNlTWFzdGVyS2V5IiwidGhlbiIsInNlc3Npb24iLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0IiwiU2Vzc2lvblRva2VuQ2FjaGUiLCJjb25zdHJ1Y3RvciIsInRpbWVvdXQiLCJtYXhTaXplIiwiY2FjaGUiLCJMUlUiLCJtYXgiLCJtYXhBZ2UiLCJnZXRVc2VySWQiLCJ1c2VySWQiLCJsb2dnZXIiLCJ2ZXJib3NlIiwicmVzb2x2ZSIsInVzZXIiLCJpZCIsInNldCIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxTQUFTQSxtQkFBVCxDQUE2QkMsWUFBN0IsRUFBMkM7QUFDekMsTUFBSUMsQ0FBQyxHQUFHLElBQUlDLGNBQU1DLEtBQVYsQ0FBZ0IsVUFBaEIsQ0FBUjtBQUNBRixFQUFBQSxDQUFDLENBQUNHLE9BQUYsQ0FBVSxjQUFWLEVBQTBCSixZQUExQjtBQUNBLFNBQU9DLENBQUMsQ0FBQ0ksS0FBRixDQUFRO0FBQUVDLElBQUFBLFlBQVksRUFBRTtBQUFoQixHQUFSLEVBQWdDQyxJQUFoQyxDQUFxQyxVQUFTQyxPQUFULEVBQWtCO0FBQzVELFFBQUksQ0FBQ0EsT0FBTCxFQUFjO0FBQ1osYUFBT0MsT0FBTyxDQUFDQyxNQUFSLENBQWUsb0NBQWYsQ0FBUDtBQUNEOztBQUNELFdBQU9GLE9BQU8sQ0FBQ0csR0FBUixDQUFZLE1BQVosQ0FBUDtBQUNELEdBTE0sQ0FBUDtBQU1EOztBQUVELE1BQU1DLGlCQUFOLENBQXdCO0FBR3RCQyxFQUFBQSxXQUFXLENBQ1RDLE9BQWUsR0FBRyxLQUFLLEVBQUwsR0FBVSxFQUFWLEdBQWUsRUFBZixHQUFvQixJQUQ3QixFQUVUQyxPQUFlLEdBQUcsS0FGVCxFQUdUO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLElBQUlDLGlCQUFKLENBQVE7QUFDbkJDLE1BQUFBLEdBQUcsRUFBRUgsT0FEYztBQUVuQkksTUFBQUEsTUFBTSxFQUFFTDtBQUZXLEtBQVIsQ0FBYjtBQUlEOztBQUVETSxFQUFBQSxTQUFTLENBQUNwQixZQUFELEVBQTRCO0FBQ25DLFFBQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixhQUFPUyxPQUFPLENBQUNDLE1BQVIsQ0FBZSxvQkFBZixDQUFQO0FBQ0Q7O0FBQ0QsVUFBTVcsTUFBTSxHQUFHLEtBQUtMLEtBQUwsQ0FBV0wsR0FBWCxDQUFlWCxZQUFmLENBQWY7O0FBQ0EsUUFBSXFCLE1BQUosRUFBWTtBQUNWQyxzQkFBT0MsT0FBUCxDQUNFLCtDQURGLEVBRUVGLE1BRkYsRUFHRXJCLFlBSEY7O0FBS0EsYUFBT1MsT0FBTyxDQUFDZSxPQUFSLENBQWdCSCxNQUFoQixDQUFQO0FBQ0Q7O0FBQ0QsV0FBT3RCLG1CQUFtQixDQUFDQyxZQUFELENBQW5CLENBQWtDTyxJQUFsQyxDQUNMa0IsSUFBSSxJQUFJO0FBQ05ILHNCQUFPQyxPQUFQLENBQ0UsK0NBREYsRUFFRUUsSUFBSSxDQUFDQyxFQUZQLEVBR0UxQixZQUhGOztBQUtBLFlBQU1xQixNQUFNLEdBQUdJLElBQUksQ0FBQ0MsRUFBcEI7QUFDQSxXQUFLVixLQUFMLENBQVdXLEdBQVgsQ0FBZTNCLFlBQWYsRUFBNkJxQixNQUE3QjtBQUNBLGFBQU9aLE9BQU8sQ0FBQ2UsT0FBUixDQUFnQkgsTUFBaEIsQ0FBUDtBQUNELEtBVkksRUFXTE8sS0FBSyxJQUFJO0FBQ1BOLHNCQUFPTSxLQUFQLENBQ0Usb0RBREYsRUFFRTVCLFlBRkYsRUFHRTRCLEtBSEY7O0FBS0EsYUFBT25CLE9BQU8sQ0FBQ0MsTUFBUixDQUFla0IsS0FBZixDQUFQO0FBQ0QsS0FsQkksQ0FBUDtBQW9CRDs7QUE5Q3FCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuXG5mdW5jdGlvbiB1c2VyRm9yU2Vzc2lvblRva2VuKHNlc3Npb25Ub2tlbikge1xuICB2YXIgcSA9IG5ldyBQYXJzZS5RdWVyeSgnX1Nlc3Npb24nKTtcbiAgcS5lcXVhbFRvKCdzZXNzaW9uVG9rZW4nLCBzZXNzaW9uVG9rZW4pO1xuICByZXR1cm4gcS5maXJzdCh7IHVzZU1hc3RlcktleTogdHJ1ZSB9KS50aGVuKGZ1bmN0aW9uKHNlc3Npb24pIHtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnTm8gc2Vzc2lvbiBmb3VuZCBmb3Igc2Vzc2lvbiB0b2tlbicpO1xuICAgIH1cbiAgICByZXR1cm4gc2Vzc2lvbi5nZXQoJ3VzZXInKTtcbiAgfSk7XG59XG5cbmNsYXNzIFNlc3Npb25Ub2tlbkNhY2hlIHtcbiAgY2FjaGU6IE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgbWF4U2l6ZTogbnVtYmVyID0gMTAwMDBcbiAgKSB7XG4gICAgdGhpcy5jYWNoZSA9IG5ldyBMUlUoe1xuICAgICAgbWF4OiBtYXhTaXplLFxuICAgICAgbWF4QWdlOiB0aW1lb3V0LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklkKHNlc3Npb25Ub2tlbjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXNlc3Npb25Ub2tlbikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdFbXB0eSBzZXNzaW9uVG9rZW4nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5jYWNoZS5nZXQoc2Vzc2lvblRva2VuKTtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgJ0ZldGNoIHVzZXJJZCAlcyBvZiBzZXNzaW9uVG9rZW4gJXMgZnJvbSBDYWNoZScsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICApO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1c2VySWQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlckZvclNlc3Npb25Ub2tlbihzZXNzaW9uVG9rZW4pLnRoZW4oXG4gICAgICB1c2VyID0+IHtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICAgICAgJ0ZldGNoIHVzZXJJZCAlcyBvZiBzZXNzaW9uVG9rZW4gJXMgZnJvbSBQYXJzZScsXG4gICAgICAgICAgdXNlci5pZCxcbiAgICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdXNlcklkID0gdXNlci5pZDtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoc2Vzc2lvblRva2VuLCB1c2VySWQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgJ0NhbiBub3QgZmV0Y2ggdXNlcklkIGZvciBzZXNzaW9uVG9rZW4gJWosIGVycm9yICVqJyxcbiAgICAgICAgICBzZXNzaW9uVG9rZW4sXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IFNlc3Npb25Ub2tlbkNhY2hlIH07XG4iXX0=
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvU2Vzc2lvblRva2VuQ2FjaGUuanMiXSwibmFtZXMiOlsidXNlckZvclNlc3Npb25Ub2tlbiIsInNlc3Npb25Ub2tlbiIsInEiLCJQYXJzZSIsIlF1ZXJ5IiwiZXF1YWxUbyIsImZpcnN0IiwidXNlTWFzdGVyS2V5IiwidGhlbiIsInNlc3Npb24iLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0IiwiU2Vzc2lvblRva2VuQ2FjaGUiLCJjb25zdHJ1Y3RvciIsInRpbWVvdXQiLCJtYXhTaXplIiwiY2FjaGUiLCJMUlUiLCJtYXgiLCJtYXhBZ2UiLCJnZXRVc2VySWQiLCJ1c2VySWQiLCJsb2dnZXIiLCJ2ZXJib3NlIiwicmVzb2x2ZSIsInVzZXIiLCJpZCIsInNldCIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxTQUFTQSxtQkFBVCxDQUE2QkMsWUFBN0IsRUFBMkM7QUFDekMsTUFBSUMsQ0FBQyxHQUFHLElBQUlDLGNBQU1DLEtBQVYsQ0FBZ0IsVUFBaEIsQ0FBUjtBQUNBRixFQUFBQSxDQUFDLENBQUNHLE9BQUYsQ0FBVSxjQUFWLEVBQTBCSixZQUExQjtBQUNBLFNBQU9DLENBQUMsQ0FBQ0ksS0FBRixDQUFRO0FBQUVDLElBQUFBLFlBQVksRUFBRTtBQUFoQixHQUFSLEVBQWdDQyxJQUFoQyxDQUFxQyxVQUFVQyxPQUFWLEVBQW1CO0FBQzdELFFBQUksQ0FBQ0EsT0FBTCxFQUFjO0FBQ1osYUFBT0MsT0FBTyxDQUFDQyxNQUFSLENBQWUsb0NBQWYsQ0FBUDtBQUNEOztBQUNELFdBQU9GLE9BQU8sQ0FBQ0csR0FBUixDQUFZLE1BQVosQ0FBUDtBQUNELEdBTE0sQ0FBUDtBQU1EOztBQUVELE1BQU1DLGlCQUFOLENBQXdCO0FBR3RCQyxFQUFBQSxXQUFXLENBQ1RDLE9BQWUsR0FBRyxLQUFLLEVBQUwsR0FBVSxFQUFWLEdBQWUsRUFBZixHQUFvQixJQUQ3QixFQUVUQyxPQUFlLEdBQUcsS0FGVCxFQUdUO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLElBQUlDLGlCQUFKLENBQVE7QUFDbkJDLE1BQUFBLEdBQUcsRUFBRUgsT0FEYztBQUVuQkksTUFBQUEsTUFBTSxFQUFFTDtBQUZXLEtBQVIsQ0FBYjtBQUlEOztBQUVETSxFQUFBQSxTQUFTLENBQUNwQixZQUFELEVBQTRCO0FBQ25DLFFBQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixhQUFPUyxPQUFPLENBQUNDLE1BQVIsQ0FBZSxvQkFBZixDQUFQO0FBQ0Q7O0FBQ0QsVUFBTVcsTUFBTSxHQUFHLEtBQUtMLEtBQUwsQ0FBV0wsR0FBWCxDQUFlWCxZQUFmLENBQWY7O0FBQ0EsUUFBSXFCLE1BQUosRUFBWTtBQUNWQyxzQkFBT0MsT0FBUCxDQUNFLCtDQURGLEVBRUVGLE1BRkYsRUFHRXJCLFlBSEY7O0FBS0EsYUFBT1MsT0FBTyxDQUFDZSxPQUFSLENBQWdCSCxNQUFoQixDQUFQO0FBQ0Q7O0FBQ0QsV0FBT3RCLG1CQUFtQixDQUFDQyxZQUFELENBQW5CLENBQWtDTyxJQUFsQyxDQUNMa0IsSUFBSSxJQUFJO0FBQ05ILHNCQUFPQyxPQUFQLENBQ0UsK0NBREYsRUFFRUUsSUFBSSxDQUFDQyxFQUZQLEVBR0UxQixZQUhGOztBQUtBLFlBQU1xQixNQUFNLEdBQUdJLElBQUksQ0FBQ0MsRUFBcEI7QUFDQSxXQUFLVixLQUFMLENBQVdXLEdBQVgsQ0FBZTNCLFlBQWYsRUFBNkJxQixNQUE3QjtBQUNBLGFBQU9aLE9BQU8sQ0FBQ2UsT0FBUixDQUFnQkgsTUFBaEIsQ0FBUDtBQUNELEtBVkksRUFXTE8sS0FBSyxJQUFJO0FBQ1BOLHNCQUFPTSxLQUFQLENBQ0Usb0RBREYsRUFFRTVCLFlBRkYsRUFHRTRCLEtBSEY7O0FBS0EsYUFBT25CLE9BQU8sQ0FBQ0MsTUFBUixDQUFla0IsS0FBZixDQUFQO0FBQ0QsS0FsQkksQ0FBUDtBQW9CRDs7QUE5Q3FCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuXG5mdW5jdGlvbiB1c2VyRm9yU2Vzc2lvblRva2VuKHNlc3Npb25Ub2tlbikge1xuICB2YXIgcSA9IG5ldyBQYXJzZS5RdWVyeSgnX1Nlc3Npb24nKTtcbiAgcS5lcXVhbFRvKCdzZXNzaW9uVG9rZW4nLCBzZXNzaW9uVG9rZW4pO1xuICByZXR1cm4gcS5maXJzdCh7IHVzZU1hc3RlcktleTogdHJ1ZSB9KS50aGVuKGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ05vIHNlc3Npb24gZm91bmQgZm9yIHNlc3Npb24gdG9rZW4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlc3Npb24uZ2V0KCd1c2VyJyk7XG4gIH0pO1xufVxuXG5jbGFzcyBTZXNzaW9uVG9rZW5DYWNoZSB7XG4gIGNhY2hlOiBPYmplY3Q7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGltZW91dDogbnVtYmVyID0gMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIG1heFNpemU6IG51bWJlciA9IDEwMDAwXG4gICkge1xuICAgIHRoaXMuY2FjaGUgPSBuZXcgTFJVKHtcbiAgICAgIG1heDogbWF4U2l6ZSxcbiAgICAgIG1heEFnZTogdGltZW91dCxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFVzZXJJZChzZXNzaW9uVG9rZW46IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFzZXNzaW9uVG9rZW4pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnRW1wdHkgc2Vzc2lvblRva2VuJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuY2FjaGUuZ2V0KHNlc3Npb25Ub2tlbik7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICAgICdGZXRjaCB1c2VySWQgJXMgb2Ygc2Vzc2lvblRva2VuICVzIGZyb20gQ2FjaGUnLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcklkKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJGb3JTZXNzaW9uVG9rZW4oc2Vzc2lvblRva2VuKS50aGVuKFxuICAgICAgdXNlciA9PiB7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgICAgICdGZXRjaCB1c2VySWQgJXMgb2Ygc2Vzc2lvblRva2VuICVzIGZyb20gUGFyc2UnLFxuICAgICAgICAgIHVzZXIuaWQsXG4gICAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IHVzZXIuaWQ7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KHNlc3Npb25Ub2tlbiwgdXNlcklkKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1c2VySWQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICdDYW4gbm90IGZldGNoIHVzZXJJZCBmb3Igc2Vzc2lvblRva2VuICVqLCBlcnJvciAlaicsXG4gICAgICAgICAgc2Vzc2lvblRva2VuLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZXNzaW9uVG9rZW5DYWNoZSB9O1xuIl19
|
||||
File diff suppressed because one or more lines are too long
+10
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -87,4 +87,4 @@ module.exports = {
|
||||
arrayParser,
|
||||
objectParser
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9PcHRpb25zL3BhcnNlcnMuanMiXSwibmFtZXMiOlsibnVtYmVyUGFyc2VyIiwia2V5Iiwib3B0IiwiaW50T3B0IiwicGFyc2VJbnQiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJFcnJvciIsIm51bWJlck9yQm9vbFBhcnNlciIsIm9iamVjdFBhcnNlciIsIkpTT04iLCJwYXJzZSIsImFycmF5UGFyc2VyIiwiQXJyYXkiLCJpc0FycmF5Iiwic3BsaXQiLCJtb2R1bGVPck9iamVjdFBhcnNlciIsImUiLCJib29sZWFuUGFyc2VyIiwibnVsbFBhcnNlciIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUEsU0FBU0EsWUFBVCxDQUFzQkMsR0FBdEIsRUFBMkI7QUFDekIsU0FBTyxVQUFTQyxHQUFULEVBQWM7QUFDbkIsVUFBTUMsTUFBTSxHQUFHQyxRQUFRLENBQUNGLEdBQUQsQ0FBdkI7O0FBQ0EsUUFBSSxDQUFDRyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJILE1BQWpCLENBQUwsRUFBK0I7QUFDN0IsWUFBTSxJQUFJSSxLQUFKLENBQVcsT0FBTU4sR0FBSSxzQkFBcUJDLEdBQUksRUFBOUMsQ0FBTjtBQUNEOztBQUNELFdBQU9DLE1BQVA7QUFDRCxHQU5EO0FBT0Q7O0FBRUQsU0FBU0ssa0JBQVQsQ0FBNEJQLEdBQTVCLEVBQWlDO0FBQy9CLFNBQU8sVUFBU0MsR0FBVCxFQUFjO0FBQ25CLFFBQUksT0FBT0EsR0FBUCxLQUFlLFNBQW5CLEVBQThCO0FBQzVCLGFBQU9BLEdBQVA7QUFDRDs7QUFDRCxRQUFJQSxHQUFHLEtBQUssTUFBWixFQUFvQjtBQUNsQixhQUFPLElBQVA7QUFDRDs7QUFDRCxRQUFJQSxHQUFHLEtBQUssT0FBWixFQUFxQjtBQUNuQixhQUFPLEtBQVA7QUFDRDs7QUFDRCxXQUFPRixZQUFZLENBQUNDLEdBQUQsQ0FBWixDQUFrQkMsR0FBbEIsQ0FBUDtBQUNELEdBWEQ7QUFZRDs7QUFFRCxTQUFTTyxZQUFULENBQXNCUCxHQUF0QixFQUEyQjtBQUN6QixNQUFJLE9BQU9BLEdBQVAsSUFBYyxRQUFsQixFQUE0QjtBQUMxQixXQUFPQSxHQUFQO0FBQ0Q7O0FBQ0QsU0FBT1EsSUFBSSxDQUFDQyxLQUFMLENBQVdULEdBQVgsQ0FBUDtBQUNEOztBQUVELFNBQVNVLFdBQVQsQ0FBcUJWLEdBQXJCLEVBQTBCO0FBQ3hCLE1BQUlXLEtBQUssQ0FBQ0MsT0FBTixDQUFjWixHQUFkLENBQUosRUFBd0I7QUFDdEIsV0FBT0EsR0FBUDtBQUNELEdBRkQsTUFFTyxJQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUFuQixFQUE2QjtBQUNsQyxXQUFPQSxHQUFHLENBQUNhLEtBQUosQ0FBVSxHQUFWLENBQVA7QUFDRCxHQUZNLE1BRUE7QUFDTCxVQUFNLElBQUlSLEtBQUosQ0FBVyxHQUFFTCxHQUFJLGlEQUFqQixDQUFOO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTYyxvQkFBVCxDQUE4QmQsR0FBOUIsRUFBbUM7QUFDakMsTUFBSSxPQUFPQSxHQUFQLElBQWMsUUFBbEIsRUFBNEI7QUFDMUIsV0FBT0EsR0FBUDtBQUNEOztBQUNELE1BQUk7QUFDRixXQUFPUSxJQUFJLENBQUNDLEtBQUwsQ0FBV1QsR0FBWCxDQUFQO0FBQ0QsR0FGRCxDQUVFLE9BQU9lLENBQVAsRUFBVTtBQUNWO0FBQ0Q7O0FBQ0QsU0FBT2YsR0FBUDtBQUNEOztBQUVELFNBQVNnQixhQUFULENBQXVCaEIsR0FBdkIsRUFBNEI7QUFDMUIsTUFBSUEsR0FBRyxJQUFJLElBQVAsSUFBZUEsR0FBRyxJQUFJLE1BQXRCLElBQWdDQSxHQUFHLElBQUksR0FBM0MsRUFBZ0Q7QUFDOUMsV0FBTyxJQUFQO0FBQ0Q7O0FBQ0QsU0FBTyxLQUFQO0FBQ0Q7O0FBRUQsU0FBU2lCLFVBQVQsQ0FBb0JqQixHQUFwQixFQUF5QjtBQUN2QixNQUFJQSxHQUFHLElBQUksTUFBWCxFQUFtQjtBQUNqQixXQUFPLElBQVA7QUFDRDs7QUFDRCxTQUFPQSxHQUFQO0FBQ0Q7O0FBRURrQixNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZnJCLEVBQUFBLFlBRGU7QUFFZlEsRUFBQUEsa0JBRmU7QUFHZlcsRUFBQUEsVUFIZTtBQUlmRCxFQUFBQSxhQUplO0FBS2ZGLEVBQUFBLG9CQUxlO0FBTWZKLEVBQUFBLFdBTmU7QUFPZkgsRUFBQUE7QUFQZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG51bWJlclBhcnNlcihrZXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9wdCkge1xuICAgIGNvbnN0IGludE9wdCA9IHBhcnNlSW50KG9wdCk7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGludE9wdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5ICR7a2V5fSBoYXMgaW52YWxpZCB2YWx1ZSAke29wdH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGludE9wdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyT3JCb29sUGFyc2VyKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob3B0KSB7XG4gICAgaWYgKHR5cGVvZiBvcHQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIG9wdDtcbiAgICB9XG4gICAgaWYgKG9wdCA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdCA9PT0gJ2ZhbHNlJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbnVtYmVyUGFyc2VyKGtleSkob3B0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0UGFyc2VyKG9wdCkge1xuICBpZiAodHlwZW9mIG9wdCA9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvcHQ7XG4gIH1cbiAgcmV0dXJuIEpTT04ucGFyc2Uob3B0KTtcbn1cblxuZnVuY3Rpb24gYXJyYXlQYXJzZXIob3B0KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdCkpIHtcbiAgICByZXR1cm4gb3B0O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG9wdC5zcGxpdCgnLCcpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtvcHR9IHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb3IgYW4gYXJyYXlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb2R1bGVPck9iamVjdFBhcnNlcihvcHQpIHtcbiAgaWYgKHR5cGVvZiBvcHQgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb3B0O1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uob3B0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qICovXG4gIH1cbiAgcmV0dXJuIG9wdDtcbn1cblxuZnVuY3Rpb24gYm9vbGVhblBhcnNlcihvcHQpIHtcbiAgaWYgKG9wdCA9PSB0cnVlIHx8IG9wdCA9PSAndHJ1ZScgfHwgb3B0ID09ICcxJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbnVsbFBhcnNlcihvcHQpIHtcbiAgaWYgKG9wdCA9PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gb3B0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbnVtYmVyUGFyc2VyLFxuICBudW1iZXJPckJvb2xQYXJzZXIsXG4gIG51bGxQYXJzZXIsXG4gIGJvb2xlYW5QYXJzZXIsXG4gIG1vZHVsZU9yT2JqZWN0UGFyc2VyLFxuICBhcnJheVBhcnNlcixcbiAgb2JqZWN0UGFyc2VyLFxufTtcbiJdfQ==
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9PcHRpb25zL3BhcnNlcnMuanMiXSwibmFtZXMiOlsibnVtYmVyUGFyc2VyIiwia2V5Iiwib3B0IiwiaW50T3B0IiwicGFyc2VJbnQiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJFcnJvciIsIm51bWJlck9yQm9vbFBhcnNlciIsIm9iamVjdFBhcnNlciIsIkpTT04iLCJwYXJzZSIsImFycmF5UGFyc2VyIiwiQXJyYXkiLCJpc0FycmF5Iiwic3BsaXQiLCJtb2R1bGVPck9iamVjdFBhcnNlciIsImUiLCJib29sZWFuUGFyc2VyIiwibnVsbFBhcnNlciIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUEsU0FBU0EsWUFBVCxDQUFzQkMsR0FBdEIsRUFBMkI7QUFDekIsU0FBTyxVQUFVQyxHQUFWLEVBQWU7QUFDcEIsVUFBTUMsTUFBTSxHQUFHQyxRQUFRLENBQUNGLEdBQUQsQ0FBdkI7O0FBQ0EsUUFBSSxDQUFDRyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJILE1BQWpCLENBQUwsRUFBK0I7QUFDN0IsWUFBTSxJQUFJSSxLQUFKLENBQVcsT0FBTU4sR0FBSSxzQkFBcUJDLEdBQUksRUFBOUMsQ0FBTjtBQUNEOztBQUNELFdBQU9DLE1BQVA7QUFDRCxHQU5EO0FBT0Q7O0FBRUQsU0FBU0ssa0JBQVQsQ0FBNEJQLEdBQTVCLEVBQWlDO0FBQy9CLFNBQU8sVUFBVUMsR0FBVixFQUFlO0FBQ3BCLFFBQUksT0FBT0EsR0FBUCxLQUFlLFNBQW5CLEVBQThCO0FBQzVCLGFBQU9BLEdBQVA7QUFDRDs7QUFDRCxRQUFJQSxHQUFHLEtBQUssTUFBWixFQUFvQjtBQUNsQixhQUFPLElBQVA7QUFDRDs7QUFDRCxRQUFJQSxHQUFHLEtBQUssT0FBWixFQUFxQjtBQUNuQixhQUFPLEtBQVA7QUFDRDs7QUFDRCxXQUFPRixZQUFZLENBQUNDLEdBQUQsQ0FBWixDQUFrQkMsR0FBbEIsQ0FBUDtBQUNELEdBWEQ7QUFZRDs7QUFFRCxTQUFTTyxZQUFULENBQXNCUCxHQUF0QixFQUEyQjtBQUN6QixNQUFJLE9BQU9BLEdBQVAsSUFBYyxRQUFsQixFQUE0QjtBQUMxQixXQUFPQSxHQUFQO0FBQ0Q7O0FBQ0QsU0FBT1EsSUFBSSxDQUFDQyxLQUFMLENBQVdULEdBQVgsQ0FBUDtBQUNEOztBQUVELFNBQVNVLFdBQVQsQ0FBcUJWLEdBQXJCLEVBQTBCO0FBQ3hCLE1BQUlXLEtBQUssQ0FBQ0MsT0FBTixDQUFjWixHQUFkLENBQUosRUFBd0I7QUFDdEIsV0FBT0EsR0FBUDtBQUNELEdBRkQsTUFFTyxJQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUFuQixFQUE2QjtBQUNsQyxXQUFPQSxHQUFHLENBQUNhLEtBQUosQ0FBVSxHQUFWLENBQVA7QUFDRCxHQUZNLE1BRUE7QUFDTCxVQUFNLElBQUlSLEtBQUosQ0FBVyxHQUFFTCxHQUFJLGlEQUFqQixDQUFOO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTYyxvQkFBVCxDQUE4QmQsR0FBOUIsRUFBbUM7QUFDakMsTUFBSSxPQUFPQSxHQUFQLElBQWMsUUFBbEIsRUFBNEI7QUFDMUIsV0FBT0EsR0FBUDtBQUNEOztBQUNELE1BQUk7QUFDRixXQUFPUSxJQUFJLENBQUNDLEtBQUwsQ0FBV1QsR0FBWCxDQUFQO0FBQ0QsR0FGRCxDQUVFLE9BQU9lLENBQVAsRUFBVTtBQUNWO0FBQ0Q7O0FBQ0QsU0FBT2YsR0FBUDtBQUNEOztBQUVELFNBQVNnQixhQUFULENBQXVCaEIsR0FBdkIsRUFBNEI7QUFDMUIsTUFBSUEsR0FBRyxJQUFJLElBQVAsSUFBZUEsR0FBRyxJQUFJLE1BQXRCLElBQWdDQSxHQUFHLElBQUksR0FBM0MsRUFBZ0Q7QUFDOUMsV0FBTyxJQUFQO0FBQ0Q7O0FBQ0QsU0FBTyxLQUFQO0FBQ0Q7O0FBRUQsU0FBU2lCLFVBQVQsQ0FBb0JqQixHQUFwQixFQUF5QjtBQUN2QixNQUFJQSxHQUFHLElBQUksTUFBWCxFQUFtQjtBQUNqQixXQUFPLElBQVA7QUFDRDs7QUFDRCxTQUFPQSxHQUFQO0FBQ0Q7O0FBRURrQixNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZnJCLEVBQUFBLFlBRGU7QUFFZlEsRUFBQUEsa0JBRmU7QUFHZlcsRUFBQUEsVUFIZTtBQUlmRCxFQUFBQSxhQUplO0FBS2ZGLEVBQUFBLG9CQUxlO0FBTWZKLEVBQUFBLFdBTmU7QUFPZkgsRUFBQUE7QUFQZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG51bWJlclBhcnNlcihrZXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvcHQpIHtcbiAgICBjb25zdCBpbnRPcHQgPSBwYXJzZUludChvcHQpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbnRPcHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSAke2tleX0gaGFzIGludmFsaWQgdmFsdWUgJHtvcHR9YCk7XG4gICAgfVxuICAgIHJldHVybiBpbnRPcHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG51bWJlck9yQm9vbFBhcnNlcihrZXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvcHQpIHtcbiAgICBpZiAodHlwZW9mIG9wdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH1cbiAgICBpZiAob3B0ID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0ID09PSAnZmFsc2UnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBudW1iZXJQYXJzZXIoa2V5KShvcHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvYmplY3RQYXJzZXIob3B0KSB7XG4gIGlmICh0eXBlb2Ygb3B0ID09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdDtcbiAgfVxuICByZXR1cm4gSlNPTi5wYXJzZShvcHQpO1xufVxuXG5mdW5jdGlvbiBhcnJheVBhcnNlcihvcHQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0KSkge1xuICAgIHJldHVybiBvcHQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gb3B0LnNwbGl0KCcsJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke29wdH0gc2hvdWxkIGJlIGEgY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvciBhbiBhcnJheWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vZHVsZU9yT2JqZWN0UGFyc2VyKG9wdCkge1xuICBpZiAodHlwZW9mIG9wdCA9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvcHQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvcHQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogKi9cbiAgfVxuICByZXR1cm4gb3B0O1xufVxuXG5mdW5jdGlvbiBib29sZWFuUGFyc2VyKG9wdCkge1xuICBpZiAob3B0ID09IHRydWUgfHwgb3B0ID09ICd0cnVlJyB8fCBvcHQgPT0gJzEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBudWxsUGFyc2VyKG9wdCkge1xuICBpZiAob3B0ID09ICdudWxsJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBvcHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBudW1iZXJQYXJzZXIsXG4gIG51bWJlck9yQm9vbFBhcnNlcixcbiAgbnVsbFBhcnNlcixcbiAgYm9vbGVhblBhcnNlcixcbiAgbW9kdWxlT3JPYmplY3RQYXJzZXIsXG4gIGFycmF5UGFyc2VyLFxuICBvYmplY3RQYXJzZXIsXG59O1xuIl19
|
||||
+10
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+7
-5
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+155
-15
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -9,6 +9,8 @@ var _ClassesRouter = _interopRequireDefault(require("./ClassesRouter"));
|
||||
|
||||
var _rest = _interopRequireDefault(require("../rest"));
|
||||
|
||||
var _middlewares = require("../middlewares");
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
// InstallationsRouter.js
|
||||
@@ -22,7 +24,7 @@ class InstallationsRouter extends _ClassesRouter.default {
|
||||
|
||||
const options = _ClassesRouter.default.optionsFromBody(body);
|
||||
|
||||
return _rest.default.find(req.config, req.auth, '_Installation', body.where, options, req.info.clientSDK).then(response => {
|
||||
return _rest.default.find(req.config, req.auth, '_Installation', body.where, options, req.info.clientSDK, req.info.context).then(response => {
|
||||
return {
|
||||
response: response
|
||||
};
|
||||
@@ -36,10 +38,10 @@ class InstallationsRouter extends _ClassesRouter.default {
|
||||
this.route('GET', '/installations/:objectId', req => {
|
||||
return this.handleGet(req);
|
||||
});
|
||||
this.route('POST', '/installations', req => {
|
||||
this.route('POST', '/installations', _middlewares.promiseEnsureIdempotency, req => {
|
||||
return this.handleCreate(req);
|
||||
});
|
||||
this.route('PUT', '/installations/:objectId', req => {
|
||||
this.route('PUT', '/installations/:objectId', _middlewares.promiseEnsureIdempotency, req => {
|
||||
return this.handleUpdate(req);
|
||||
});
|
||||
this.route('DELETE', '/installations/:objectId', req => {
|
||||
@@ -52,4 +54,4 @@ class InstallationsRouter extends _ClassesRouter.default {
|
||||
exports.InstallationsRouter = InstallationsRouter;
|
||||
var _default = InstallationsRouter;
|
||||
exports.default = _default;
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0luc3RhbGxhdGlvbnNSb3V0ZXIuanMiXSwibmFtZXMiOlsiSW5zdGFsbGF0aW9uc1JvdXRlciIsIkNsYXNzZXNSb3V0ZXIiLCJjbGFzc05hbWUiLCJoYW5kbGVGaW5kIiwicmVxIiwiYm9keSIsIk9iamVjdCIsImFzc2lnbiIsIkpTT05Gcm9tUXVlcnkiLCJxdWVyeSIsIm9wdGlvbnMiLCJvcHRpb25zRnJvbUJvZHkiLCJyZXN0IiwiZmluZCIsImNvbmZpZyIsImF1dGgiLCJ3aGVyZSIsImluZm8iLCJjbGllbnRTREsiLCJ0aGVuIiwicmVzcG9uc2UiLCJtb3VudFJvdXRlcyIsInJvdXRlIiwiaGFuZGxlR2V0IiwiaGFuZGxlQ3JlYXRlIiwiaGFuZGxlVXBkYXRlIiwiaGFuZGxlRGVsZXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7O0FBQ0E7Ozs7QUFIQTtBQUtPLE1BQU1BLG1CQUFOLFNBQWtDQyxzQkFBbEMsQ0FBZ0Q7QUFDckRDLEVBQUFBLFNBQVMsR0FBRztBQUNWLFdBQU8sZUFBUDtBQUNEOztBQUVEQyxFQUFBQSxVQUFVLENBQUNDLEdBQUQsRUFBTTtBQUNkLFVBQU1DLElBQUksR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQ1hILEdBQUcsQ0FBQ0MsSUFETyxFQUVYSix1QkFBY08sYUFBZCxDQUE0QkosR0FBRyxDQUFDSyxLQUFoQyxDQUZXLENBQWI7O0FBSUEsVUFBTUMsT0FBTyxHQUFHVCx1QkFBY1UsZUFBZCxDQUE4Qk4sSUFBOUIsQ0FBaEI7O0FBQ0EsV0FBT08sY0FDSkMsSUFESSxDQUVIVCxHQUFHLENBQUNVLE1BRkQsRUFHSFYsR0FBRyxDQUFDVyxJQUhELEVBSUgsZUFKRyxFQUtIVixJQUFJLENBQUNXLEtBTEYsRUFNSE4sT0FORyxFQU9ITixHQUFHLENBQUNhLElBQUosQ0FBU0MsU0FQTixFQVNKQyxJQVRJLENBU0NDLFFBQVEsSUFBSTtBQUNoQixhQUFPO0FBQUVBLFFBQUFBLFFBQVEsRUFBRUE7QUFBWixPQUFQO0FBQ0QsS0FYSSxDQUFQO0FBWUQ7O0FBRURDLEVBQUFBLFdBQVcsR0FBRztBQUNaLFNBQUtDLEtBQUwsQ0FBVyxLQUFYLEVBQWtCLGdCQUFsQixFQUFvQ2xCLEdBQUcsSUFBSTtBQUN6QyxhQUFPLEtBQUtELFVBQUwsQ0FBZ0JDLEdBQWhCLENBQVA7QUFDRCxLQUZEO0FBR0EsU0FBS2tCLEtBQUwsQ0FBVyxLQUFYLEVBQWtCLDBCQUFsQixFQUE4Q2xCLEdBQUcsSUFBSTtBQUNuRCxhQUFPLEtBQUttQixTQUFMLENBQWVuQixHQUFmLENBQVA7QUFDRCxLQUZEO0FBR0EsU0FBS2tCLEtBQUwsQ0FBVyxNQUFYLEVBQW1CLGdCQUFuQixFQUFxQ2xCLEdBQUcsSUFBSTtBQUMxQyxhQUFPLEtBQUtvQixZQUFMLENBQWtCcEIsR0FBbEIsQ0FBUDtBQUNELEtBRkQ7QUFHQSxTQUFLa0IsS0FBTCxDQUFXLEtBQVgsRUFBa0IsMEJBQWxCLEVBQThDbEIsR0FBRyxJQUFJO0FBQ25ELGFBQU8sS0FBS3FCLFlBQUwsQ0FBa0JyQixHQUFsQixDQUFQO0FBQ0QsS0FGRDtBQUdBLFNBQUtrQixLQUFMLENBQVcsUUFBWCxFQUFxQiwwQkFBckIsRUFBaURsQixHQUFHLElBQUk7QUFDdEQsYUFBTyxLQUFLc0IsWUFBTCxDQUFrQnRCLEdBQWxCLENBQVA7QUFDRCxLQUZEO0FBR0Q7O0FBekNvRDs7O2VBNEN4Q0osbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbnN0YWxsYXRpb25zUm91dGVyLmpzXG5cbmltcG9ydCBDbGFzc2VzUm91dGVyIGZyb20gJy4vQ2xhc3Nlc1JvdXRlcic7XG5pbXBvcnQgcmVzdCBmcm9tICcuLi9yZXN0JztcblxuZXhwb3J0IGNsYXNzIEluc3RhbGxhdGlvbnNSb3V0ZXIgZXh0ZW5kcyBDbGFzc2VzUm91dGVyIHtcbiAgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnX0luc3RhbGxhdGlvbic7XG4gIH1cblxuICBoYW5kbGVGaW5kKHJlcSkge1xuICAgIGNvbnN0IGJvZHkgPSBPYmplY3QuYXNzaWduKFxuICAgICAgcmVxLmJvZHksXG4gICAgICBDbGFzc2VzUm91dGVyLkpTT05Gcm9tUXVlcnkocmVxLnF1ZXJ5KVxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IENsYXNzZXNSb3V0ZXIub3B0aW9uc0Zyb21Cb2R5KGJvZHkpO1xuICAgIHJldHVybiByZXN0XG4gICAgICAuZmluZChcbiAgICAgICAgcmVxLmNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGgsXG4gICAgICAgICdfSW5zdGFsbGF0aW9uJyxcbiAgICAgICAgYm9keS53aGVyZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmVxLmluZm8uY2xpZW50U0RLXG4gICAgICApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSB9O1xuICAgICAgfSk7XG4gIH1cblxuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKCdHRVQnLCAnL2luc3RhbGxhdGlvbnMnLCByZXEgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRmluZChyZXEpO1xuICAgIH0pO1xuICAgIHRoaXMucm91dGUoJ0dFVCcsICcvaW5zdGFsbGF0aW9ucy86b2JqZWN0SWQnLCByZXEgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlR2V0KHJlcSk7XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZSgnUE9TVCcsICcvaW5zdGFsbGF0aW9ucycsIHJlcSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVDcmVhdGUocmVxKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKCdQVVQnLCAnL2luc3RhbGxhdGlvbnMvOm9iamVjdElkJywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZVVwZGF0ZShyZXEpO1xuICAgIH0pO1xuICAgIHRoaXMucm91dGUoJ0RFTEVURScsICcvaW5zdGFsbGF0aW9ucy86b2JqZWN0SWQnLCByZXEgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRGVsZXRlKHJlcSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5zdGFsbGF0aW9uc1JvdXRlcjtcbiJdfQ==
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0luc3RhbGxhdGlvbnNSb3V0ZXIuanMiXSwibmFtZXMiOlsiSW5zdGFsbGF0aW9uc1JvdXRlciIsIkNsYXNzZXNSb3V0ZXIiLCJjbGFzc05hbWUiLCJoYW5kbGVGaW5kIiwicmVxIiwiYm9keSIsIk9iamVjdCIsImFzc2lnbiIsIkpTT05Gcm9tUXVlcnkiLCJxdWVyeSIsIm9wdGlvbnMiLCJvcHRpb25zRnJvbUJvZHkiLCJyZXN0IiwiZmluZCIsImNvbmZpZyIsImF1dGgiLCJ3aGVyZSIsImluZm8iLCJjbGllbnRTREsiLCJjb250ZXh0IiwidGhlbiIsInJlc3BvbnNlIiwibW91bnRSb3V0ZXMiLCJyb3V0ZSIsImhhbmRsZUdldCIsInByb21pc2VFbnN1cmVJZGVtcG90ZW5jeSIsImhhbmRsZUNyZWF0ZSIsImhhbmRsZVVwZGF0ZSIsImhhbmRsZURlbGV0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUNBOztBQUNBOzs7O0FBSkE7QUFNTyxNQUFNQSxtQkFBTixTQUFrQ0Msc0JBQWxDLENBQWdEO0FBQ3JEQyxFQUFBQSxTQUFTLEdBQUc7QUFDVixXQUFPLGVBQVA7QUFDRDs7QUFFREMsRUFBQUEsVUFBVSxDQUFDQyxHQUFELEVBQU07QUFDZCxVQUFNQyxJQUFJLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUNYSCxHQUFHLENBQUNDLElBRE8sRUFFWEosdUJBQWNPLGFBQWQsQ0FBNEJKLEdBQUcsQ0FBQ0ssS0FBaEMsQ0FGVyxDQUFiOztBQUlBLFVBQU1DLE9BQU8sR0FBR1QsdUJBQWNVLGVBQWQsQ0FBOEJOLElBQTlCLENBQWhCOztBQUNBLFdBQU9PLGNBQ0pDLElBREksQ0FFSFQsR0FBRyxDQUFDVSxNQUZELEVBR0hWLEdBQUcsQ0FBQ1csSUFIRCxFQUlILGVBSkcsRUFLSFYsSUFBSSxDQUFDVyxLQUxGLEVBTUhOLE9BTkcsRUFPSE4sR0FBRyxDQUFDYSxJQUFKLENBQVNDLFNBUE4sRUFRSGQsR0FBRyxDQUFDYSxJQUFKLENBQVNFLE9BUk4sRUFVSkMsSUFWSSxDQVVDQyxRQUFRLElBQUk7QUFDaEIsYUFBTztBQUFFQSxRQUFBQSxRQUFRLEVBQUVBO0FBQVosT0FBUDtBQUNELEtBWkksQ0FBUDtBQWFEOztBQUVEQyxFQUFBQSxXQUFXLEdBQUc7QUFDWixTQUFLQyxLQUFMLENBQVcsS0FBWCxFQUFrQixnQkFBbEIsRUFBb0NuQixHQUFHLElBQUk7QUFDekMsYUFBTyxLQUFLRCxVQUFMLENBQWdCQyxHQUFoQixDQUFQO0FBQ0QsS0FGRDtBQUdBLFNBQUttQixLQUFMLENBQVcsS0FBWCxFQUFrQiwwQkFBbEIsRUFBOENuQixHQUFHLElBQUk7QUFDbkQsYUFBTyxLQUFLb0IsU0FBTCxDQUFlcEIsR0FBZixDQUFQO0FBQ0QsS0FGRDtBQUdBLFNBQUttQixLQUFMLENBQVcsTUFBWCxFQUFtQixnQkFBbkIsRUFBcUNFLHFDQUFyQyxFQUErRHJCLEdBQUcsSUFBSTtBQUNwRSxhQUFPLEtBQUtzQixZQUFMLENBQWtCdEIsR0FBbEIsQ0FBUDtBQUNELEtBRkQ7QUFHQSxTQUFLbUIsS0FBTCxDQUNFLEtBREYsRUFFRSwwQkFGRixFQUdFRSxxQ0FIRixFQUlFckIsR0FBRyxJQUFJO0FBQ0wsYUFBTyxLQUFLdUIsWUFBTCxDQUFrQnZCLEdBQWxCLENBQVA7QUFDRCxLQU5IO0FBUUEsU0FBS21CLEtBQUwsQ0FBVyxRQUFYLEVBQXFCLDBCQUFyQixFQUFpRG5CLEdBQUcsSUFBSTtBQUN0RCxhQUFPLEtBQUt3QixZQUFMLENBQWtCeEIsR0FBbEIsQ0FBUDtBQUNELEtBRkQ7QUFHRDs7QUEvQ29EOzs7ZUFrRHhDSixtQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluc3RhbGxhdGlvbnNSb3V0ZXIuanNcblxuaW1wb3J0IENsYXNzZXNSb3V0ZXIgZnJvbSAnLi9DbGFzc2VzUm91dGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IHsgcHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5IH0gZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFsbGF0aW9uc1JvdXRlciBleHRlbmRzIENsYXNzZXNSb3V0ZXIge1xuICBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdfSW5zdGFsbGF0aW9uJztcbiAgfVxuXG4gIGhhbmRsZUZpbmQocmVxKSB7XG4gICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICByZXEuYm9keSxcbiAgICAgIENsYXNzZXNSb3V0ZXIuSlNPTkZyb21RdWVyeShyZXEucXVlcnkpXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zID0gQ2xhc3Nlc1JvdXRlci5vcHRpb25zRnJvbUJvZHkoYm9keSk7XG4gICAgcmV0dXJuIHJlc3RcbiAgICAgIC5maW5kKFxuICAgICAgICByZXEuY29uZmlnLFxuICAgICAgICByZXEuYXV0aCxcbiAgICAgICAgJ19JbnN0YWxsYXRpb24nLFxuICAgICAgICBib2R5LndoZXJlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByZXEuaW5mby5jbGllbnRTREssXG4gICAgICAgIHJlcS5pbmZvLmNvbnRleHRcbiAgICAgIClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIG1vdW50Um91dGVzKCkge1xuICAgIHRoaXMucm91dGUoJ0dFVCcsICcvaW5zdGFsbGF0aW9ucycsIHJlcSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVGaW5kKHJlcSk7XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZSgnR0VUJywgJy9pbnN0YWxsYXRpb25zLzpvYmplY3RJZCcsIHJlcSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVHZXQocmVxKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKCdQT1NUJywgJy9pbnN0YWxsYXRpb25zJywgcHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5LCByZXEgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQ3JlYXRlKHJlcSk7XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdQVVQnLFxuICAgICAgJy9pbnN0YWxsYXRpb25zLzpvYmplY3RJZCcsXG4gICAgICBwcm9taXNlRW5zdXJlSWRlbXBvdGVuY3ksXG4gICAgICByZXEgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVVcGRhdGUocmVxKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucm91dGUoJ0RFTEVURScsICcvaW5zdGFsbGF0aW9ucy86b2JqZWN0SWQnLCByZXEgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRGVsZXRlKHJlcSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5zdGFsbGF0aW9uc1JvdXRlcjtcbiJdfQ==
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
@@ -16,4 +16,4 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
||||
_index.ParseServer.createLiveQueryServer(undefined, options);
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvcGFyc2UtbGl2ZS1xdWVyeS1zZXJ2ZXIuanMiXSwibmFtZXMiOlsiZGVmaW5pdGlvbnMiLCJzdGFydCIsInByb2dyYW0iLCJvcHRpb25zIiwibG9nT3B0aW9ucyIsIlBhcnNlU2VydmVyIiwiY3JlYXRlTGl2ZVF1ZXJ5U2VydmVyIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOztBQUFBOztBQUNBOztBQUNBOzs7O0FBRUEscUJBQU87QUFDTEEsRUFBQUEsV0FBVyxFQUFYQSw2QkFESztBQUVMQyxFQUFBQSxLQUFLLEVBQUUsVUFBU0MsT0FBVCxFQUFrQkMsT0FBbEIsRUFBMkJDLFVBQTNCLEVBQXVDO0FBQzVDQSxJQUFBQSxVQUFVOztBQUNWQyx1QkFBWUMscUJBQVosQ0FBa0NDLFNBQWxDLEVBQTZDSixPQUE3QztBQUNEO0FBTEksQ0FBUCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWZpbml0aW9ucyBmcm9tICcuL2RlZmluaXRpb25zL3BhcnNlLWxpdmUtcXVlcnktc2VydmVyJztcbmltcG9ydCBydW5uZXIgZnJvbSAnLi91dGlscy9ydW5uZXInO1xuaW1wb3J0IHsgUGFyc2VTZXJ2ZXIgfSBmcm9tICcuLi9pbmRleCc7XG5cbnJ1bm5lcih7XG4gIGRlZmluaXRpb25zLFxuICBzdGFydDogZnVuY3Rpb24ocHJvZ3JhbSwgb3B0aW9ucywgbG9nT3B0aW9ucykge1xuICAgIGxvZ09wdGlvbnMoKTtcbiAgICBQYXJzZVNlcnZlci5jcmVhdGVMaXZlUXVlcnlTZXJ2ZXIodW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfSxcbn0pO1xuIl19
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvcGFyc2UtbGl2ZS1xdWVyeS1zZXJ2ZXIuanMiXSwibmFtZXMiOlsiZGVmaW5pdGlvbnMiLCJzdGFydCIsInByb2dyYW0iLCJvcHRpb25zIiwibG9nT3B0aW9ucyIsIlBhcnNlU2VydmVyIiwiY3JlYXRlTGl2ZVF1ZXJ5U2VydmVyIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOztBQUFBOztBQUNBOztBQUNBOzs7O0FBRUEscUJBQU87QUFDTEEsRUFBQUEsV0FBVyxFQUFYQSw2QkFESztBQUVMQyxFQUFBQSxLQUFLLEVBQUUsVUFBVUMsT0FBVixFQUFtQkMsT0FBbkIsRUFBNEJDLFVBQTVCLEVBQXdDO0FBQzdDQSxJQUFBQSxVQUFVOztBQUNWQyx1QkFBWUMscUJBQVosQ0FBa0NDLFNBQWxDLEVBQTZDSixPQUE3QztBQUNEO0FBTEksQ0FBUCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWZpbml0aW9ucyBmcm9tICcuL2RlZmluaXRpb25zL3BhcnNlLWxpdmUtcXVlcnktc2VydmVyJztcbmltcG9ydCBydW5uZXIgZnJvbSAnLi91dGlscy9ydW5uZXInO1xuaW1wb3J0IHsgUGFyc2VTZXJ2ZXIgfSBmcm9tICcuLi9pbmRleCc7XG5cbnJ1bm5lcih7XG4gIGRlZmluaXRpb25zLFxuICBzdGFydDogZnVuY3Rpb24gKHByb2dyYW0sIG9wdGlvbnMsIGxvZ09wdGlvbnMpIHtcbiAgICBsb2dPcHRpb25zKCk7XG4gICAgUGFyc2VTZXJ2ZXIuY3JlYXRlTGl2ZVF1ZXJ5U2VydmVyKHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH0sXG59KTtcbiJdfQ==
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+101
-10
File diff suppressed because one or more lines are too long
+10
-5
@@ -5,10 +5,15 @@
|
||||
var bcrypt = require('bcryptjs');
|
||||
|
||||
try {
|
||||
bcrypt = require('bcrypt');
|
||||
} catch (e) {}
|
||||
/* */
|
||||
// Returns a promise for a hashed password string.
|
||||
const _bcrypt = require('@node-rs/bcrypt');
|
||||
|
||||
bcrypt = {
|
||||
hash: _bcrypt.hash,
|
||||
compare: _bcrypt.verify
|
||||
};
|
||||
} catch (e) {
|
||||
/* */
|
||||
} // Returns a promise for a hashed password string.
|
||||
|
||||
|
||||
function hash(password) {
|
||||
@@ -30,4 +35,4 @@ module.exports = {
|
||||
hash: hash,
|
||||
compare: compare
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXNzd29yZC5qcyJdLCJuYW1lcyI6WyJiY3J5cHQiLCJyZXF1aXJlIiwiZSIsImhhc2giLCJwYXNzd29yZCIsImNvbXBhcmUiLCJoYXNoZWRQYXNzd29yZCIsIlByb21pc2UiLCJyZXNvbHZlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0EsSUFBSUEsTUFBTSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUFwQjs7QUFFQSxJQUFJO0FBQ0ZELEVBQUFBLE1BQU0sR0FBR0MsT0FBTyxDQUFDLFFBQUQsQ0FBaEI7QUFDRCxDQUZELENBRUUsT0FBT0MsQ0FBUCxFQUFVLENBRVg7QUFEQztBQUdGOzs7QUFDQSxTQUFTQyxJQUFULENBQWNDLFFBQWQsRUFBd0I7QUFDdEIsU0FBT0osTUFBTSxDQUFDRyxJQUFQLENBQVlDLFFBQVosRUFBc0IsRUFBdEIsQ0FBUDtBQUNELEMsQ0FFRDtBQUNBOzs7QUFDQSxTQUFTQyxPQUFULENBQWlCRCxRQUFqQixFQUEyQkUsY0FBM0IsRUFBMkM7QUFDekM7QUFDQSxNQUFJLENBQUNGLFFBQUQsSUFBYSxDQUFDRSxjQUFsQixFQUFrQztBQUNoQyxXQUFPQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FBUDtBQUNEOztBQUNELFNBQU9SLE1BQU0sQ0FBQ0ssT0FBUCxDQUFlRCxRQUFmLEVBQXlCRSxjQUF6QixDQUFQO0FBQ0Q7O0FBRURHLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmUCxFQUFBQSxJQUFJLEVBQUVBLElBRFM7QUFFZkUsRUFBQUEsT0FBTyxFQUFFQTtBQUZNLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVG9vbHMgZm9yIGVuY3J5cHRpbmcgYW5kIGRlY3J5cHRpbmcgcGFzc3dvcmRzLlxuLy8gQmFzaWNhbGx5IHByb21pc2UtZnJpZW5kbHkgd3JhcHBlcnMgZm9yIGJjcnlwdC5cbnZhciBiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHRqcycpO1xuXG50cnkge1xuICBiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgLyogKi9cbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIGEgaGFzaGVkIHBhc3N3b3JkIHN0cmluZy5cbmZ1bmN0aW9uIGhhc2gocGFzc3dvcmQpIHtcbiAgcmV0dXJuIGJjcnlwdC5oYXNoKHBhc3N3b3JkLCAxMCk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciB3aGV0aGVyIHRoaXMgcGFzc3dvcmQgY29tcGFyZXMgdG8gZXF1YWwgdGhpc1xuLy8gaGFzaGVkIHBhc3N3b3JkLlxuZnVuY3Rpb24gY29tcGFyZShwYXNzd29yZCwgaGFzaGVkUGFzc3dvcmQpIHtcbiAgLy8gQ2Fubm90IGJjcnlwdCBjb21wYXJlIHdoZW4gb25lIGlzIHVuZGVmaW5lZFxuICBpZiAoIXBhc3N3b3JkIHx8ICFoYXNoZWRQYXNzd29yZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG4gIHJldHVybiBiY3J5cHQuY29tcGFyZShwYXNzd29yZCwgaGFzaGVkUGFzc3dvcmQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaGFzaDogaGFzaCxcbiAgY29tcGFyZTogY29tcGFyZSxcbn07XG4iXX0=
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXNzd29yZC5qcyJdLCJuYW1lcyI6WyJiY3J5cHQiLCJyZXF1aXJlIiwiX2JjcnlwdCIsImhhc2giLCJjb21wYXJlIiwidmVyaWZ5IiwiZSIsInBhc3N3b3JkIiwiaGFzaGVkUGFzc3dvcmQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBLElBQUlBLE1BQU0sR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBcEI7O0FBRUEsSUFBSTtBQUNGLFFBQU1DLE9BQU8sR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQXZCOztBQUNBRCxFQUFBQSxNQUFNLEdBQUc7QUFDUEcsSUFBQUEsSUFBSSxFQUFFRCxPQUFPLENBQUNDLElBRFA7QUFFUEMsSUFBQUEsT0FBTyxFQUFFRixPQUFPLENBQUNHO0FBRlYsR0FBVDtBQUlELENBTkQsQ0FNRSxPQUFPQyxDQUFQLEVBQVU7QUFDVjtBQUNELEMsQ0FFRDs7O0FBQ0EsU0FBU0gsSUFBVCxDQUFjSSxRQUFkLEVBQXdCO0FBQ3RCLFNBQU9QLE1BQU0sQ0FBQ0csSUFBUCxDQUFZSSxRQUFaLEVBQXNCLEVBQXRCLENBQVA7QUFDRCxDLENBRUQ7QUFDQTs7O0FBQ0EsU0FBU0gsT0FBVCxDQUFpQkcsUUFBakIsRUFBMkJDLGNBQTNCLEVBQTJDO0FBQ3pDO0FBQ0EsTUFBSSxDQUFDRCxRQUFELElBQWEsQ0FBQ0MsY0FBbEIsRUFBa0M7QUFDaEMsV0FBT0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEtBQWhCLENBQVA7QUFDRDs7QUFDRCxTQUFPVixNQUFNLENBQUNJLE9BQVAsQ0FBZUcsUUFBZixFQUF5QkMsY0FBekIsQ0FBUDtBQUNEOztBQUVERyxNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZlQsRUFBQUEsSUFBSSxFQUFFQSxJQURTO0FBRWZDLEVBQUFBLE9BQU8sRUFBRUE7QUFGTSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRvb2xzIGZvciBlbmNyeXB0aW5nIGFuZCBkZWNyeXB0aW5nIHBhc3N3b3Jkcy5cbi8vIEJhc2ljYWxseSBwcm9taXNlLWZyaWVuZGx5IHdyYXBwZXJzIGZvciBiY3J5cHQuXG52YXIgYmNyeXB0ID0gcmVxdWlyZSgnYmNyeXB0anMnKTtcblxudHJ5IHtcbiAgY29uc3QgX2JjcnlwdCA9IHJlcXVpcmUoJ0Bub2RlLXJzL2JjcnlwdCcpO1xuICBiY3J5cHQgPSB7XG4gICAgaGFzaDogX2JjcnlwdC5oYXNoLFxuICAgIGNvbXBhcmU6IF9iY3J5cHQudmVyaWZ5LFxuICB9O1xufSBjYXRjaCAoZSkge1xuICAvKiAqL1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBoYXNoZWQgcGFzc3dvcmQgc3RyaW5nLlxuZnVuY3Rpb24gaGFzaChwYXNzd29yZCkge1xuICByZXR1cm4gYmNyeXB0Lmhhc2gocGFzc3dvcmQsIDEwKTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZXRoZXIgdGhpcyBwYXNzd29yZCBjb21wYXJlcyB0byBlcXVhbCB0aGlzXG4vLyBoYXNoZWQgcGFzc3dvcmQuXG5mdW5jdGlvbiBjb21wYXJlKHBhc3N3b3JkLCBoYXNoZWRQYXNzd29yZCkge1xuICAvLyBDYW5ub3QgYmNyeXB0IGNvbXBhcmUgd2hlbiBvbmUgaXMgdW5kZWZpbmVkXG4gIGlmICghcGFzc3dvcmQgfHwgIWhhc2hlZFBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIGJjcnlwdC5jb21wYXJlKHBhc3N3b3JkLCBoYXNoZWRQYXNzd29yZCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBoYXNoOiBoYXNoLFxuICBjb21wYXJlOiBjb21wYXJlLFxufTtcbiJdfQ==
|
||||
+13
-13
File diff suppressed because one or more lines are too long
+151
-9
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Generated
+3113
-2904
File diff suppressed because it is too large
Load Diff
+51
-52
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "parse-server",
|
||||
"version": "4.1.0",
|
||||
"version": "4.9.3",
|
||||
"description": "An express module providing a Parse-compatible API server",
|
||||
"main": "lib/index.js",
|
||||
"repository": {
|
||||
@@ -19,83 +19,84 @@
|
||||
],
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"@apollographql/graphql-playground-html": "1.6.24",
|
||||
"@apollographql/graphql-playground-html": "1.6.26",
|
||||
"@graphql-tools/links": "^6.2.4",
|
||||
"@graphql-tools/stitch": "6.2.2",
|
||||
"@graphql-tools/utils": "6.2.2",
|
||||
"@parse/fs-files-adapter": "1.0.1",
|
||||
"@parse/push-adapter": "3.2.0",
|
||||
"@parse/s3-files-adapter": "1.4.0",
|
||||
"@parse/push-adapter": "3.3.0",
|
||||
"@parse/s3-files-adapter": "1.5.0",
|
||||
"@parse/simple-mailgun-adapter": "1.1.0",
|
||||
"apollo-server-express": "2.11.0",
|
||||
"apollo-server-express": "2.17.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "1.19.0",
|
||||
"commander": "5.0.0",
|
||||
"commander": "5.1.0",
|
||||
"cors": "2.8.5",
|
||||
"deepcopy": "2.0.0",
|
||||
"deepcopy": "2.1.0",
|
||||
"express": "4.17.1",
|
||||
"follow-redirects": "1.10.0",
|
||||
"graphql": "14.6.0",
|
||||
"follow-redirects": "1.13.0",
|
||||
"graphql": "15.3.0",
|
||||
"graphql-list-fields": "2.0.2",
|
||||
"graphql-relay": "^0.6.0",
|
||||
"graphql-tools": "^4.0.7",
|
||||
"graphql-upload": "10.0.0",
|
||||
"graphql-relay": "0.6.0",
|
||||
"graphql-upload": "11.0.0",
|
||||
"intersect": "1.0.1",
|
||||
"jsonwebtoken": "8.5.1",
|
||||
"jwks-rsa": "1.7.0",
|
||||
"ldapjs": "1.0.2",
|
||||
"lodash": "4.17.15",
|
||||
"jwks-rsa": "1.9.0",
|
||||
"ldapjs": "2.1.1",
|
||||
"lodash": "4.17.20",
|
||||
"lru-cache": "5.1.1",
|
||||
"mime": "2.4.4",
|
||||
"mongodb": "3.5.5",
|
||||
"parse": "2.11.0",
|
||||
"pg-promise": "10.4.4",
|
||||
"pluralize": "^8.0.0",
|
||||
"mime": "2.4.6",
|
||||
"mongodb": "3.6.2",
|
||||
"parse": "2.16.0",
|
||||
"pg-promise": "10.6.1",
|
||||
"pluralize": "8.0.0",
|
||||
"redis": "3.0.2",
|
||||
"semver": "7.1.3",
|
||||
"subscriptions-transport-ws": "0.9.16",
|
||||
"semver": "7.3.2",
|
||||
"subscriptions-transport-ws": "0.9.18",
|
||||
"tv4": "1.3.0",
|
||||
"uuid": "3.4.0",
|
||||
"winston": "3.2.1",
|
||||
"winston-daily-rotate-file": "4.4.2",
|
||||
"ws": "7.2.3"
|
||||
"uuid": "8.3.0",
|
||||
"winston": "3.3.3",
|
||||
"winston-daily-rotate-file": "4.5.0",
|
||||
"ws": "7.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "7.8.4",
|
||||
"@babel/core": "7.8.7",
|
||||
"@babel/plugin-proposal-object-rest-spread": "7.8.3",
|
||||
"@babel/plugin-transform-flow-strip-types": "7.8.3",
|
||||
"@babel/preset-env": "7.8.7",
|
||||
"@babel/cli": "7.10.0",
|
||||
"@babel/core": "7.10.0",
|
||||
"@babel/plugin-proposal-object-rest-spread": "7.10.0",
|
||||
"@babel/plugin-transform-flow-strip-types": "7.9.0",
|
||||
"@babel/preset-env": "7.10.0",
|
||||
"@parse/minami": "1.0.0",
|
||||
"apollo-cache-inmemory": "1.6.5",
|
||||
"apollo-client": "2.6.6",
|
||||
"apollo-link": "1.2.13",
|
||||
"apollo-link-http": "1.5.16",
|
||||
"apollo-link-ws": "1.0.19",
|
||||
"apollo-upload-client": "12.1.0",
|
||||
"apollo-utilities": "1.3.3",
|
||||
"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-utilities": "1.3.4",
|
||||
"babel-eslint": "10.1.0",
|
||||
"bcrypt-nodejs": "0.0.3",
|
||||
"cross-env": "7.0.2",
|
||||
"deep-diff": "1.0.2",
|
||||
"eslint": "6.8.0",
|
||||
"eslint-plugin-flowtype": "4.5.0",
|
||||
"eslint-plugin-flowtype": "5.1.3",
|
||||
"flow-bin": "0.119.1",
|
||||
"form-data": "3.0.0",
|
||||
"gaze": "1.1.3",
|
||||
"graphql-tag": "^2.10.1",
|
||||
"husky": "4.2.3",
|
||||
"graphql-tag": "2.10.1",
|
||||
"husky": "4.2.5",
|
||||
"jasmine": "3.5.0",
|
||||
"jsdoc": "3.6.3",
|
||||
"jsdoc-babel": "0.5.0",
|
||||
"lint-staged": "10.0.8",
|
||||
"lint-staged": "10.2.3",
|
||||
"mongodb-runner": "4.8.0",
|
||||
"node-fetch": "2.6.0",
|
||||
"nyc": "15.0.0",
|
||||
"prettier": "1.19.0"
|
||||
"node-fetch": "2.6.1",
|
||||
"nyc": "15.1.0",
|
||||
"prettier": "2.0.5"
|
||||
},
|
||||
"scripts": {
|
||||
"definitions": "node ./resources/buildConfigDefinitions.js",
|
||||
"docs": "jsdoc -c ./jsdoc-conf.json",
|
||||
"dev": "npm run build && node bin/dev",
|
||||
"lint": "flow && eslint --cache ./",
|
||||
"lint-fix": "eslint --fix --cache ./",
|
||||
"build": "babel src/ -d lib/ --copy-files",
|
||||
"watch": "babel --watch src/ -d lib/ --copy-files",
|
||||
"pretest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} mongodb-runner start",
|
||||
@@ -104,6 +105,7 @@
|
||||
"posttest": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} mongodb-runner stop",
|
||||
"coverage": "cross-env MONGODB_VERSION=${MONGODB_VERSION:=4.0.4} MONGODB_TOPOLOGY=${MONGODB_TOPOLOGY:=standalone} MONGODB_STORAGE_ENGINE=${MONGODB_STORAGE_ENGINE:=mmapv1} TESTING=1 nyc jasmine",
|
||||
"start": "node ./bin/parse-server",
|
||||
"prettier": "prettier --write {src,spec}/**/*.js",
|
||||
"prepare": "npm run build",
|
||||
"postinstall": "node -p 'require(\"./postinstall.js\")()'"
|
||||
},
|
||||
@@ -114,16 +116,13 @@
|
||||
"parse-server": "./bin/parse-server"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"bcrypt": "4.0.1"
|
||||
"@node-rs/bcrypt": "0.4.1"
|
||||
},
|
||||
"collective": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parse-server",
|
||||
"logo": "https://opencollective.com/parse-server/logo.txt?reverse=true&variant=binary"
|
||||
},
|
||||
"publishConfig": {
|
||||
"registry": "https://npm.pkg.github.com/"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parse-server"
|
||||
@@ -136,7 +135,7 @@
|
||||
"lint-staged": {
|
||||
"{src,spec}/**/*.js": [
|
||||
"prettier --write",
|
||||
"eslint --cache",
|
||||
"eslint --fix --cache",
|
||||
"git add"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@ function getENVPrefix(iface) {
|
||||
if (iface.id.name === 'LiveQueryOptions') {
|
||||
return 'PARSE_SERVER_LIVEQUERY_';
|
||||
}
|
||||
if (iface.id.name === 'IdempotencyOptions') {
|
||||
return 'PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_';
|
||||
}
|
||||
}
|
||||
|
||||
function processProperty(property, iface) {
|
||||
@@ -170,6 +173,13 @@ function parseDefaultValue(elt, value, t) {
|
||||
});
|
||||
literalValue = t.objectExpression(props);
|
||||
}
|
||||
if (type == 'IdempotencyOptions') {
|
||||
const object = parsers.objectParser(value);
|
||||
const props = Object.keys(object).map((key) => {
|
||||
return t.objectProperty(key, object[value]);
|
||||
});
|
||||
literalValue = t.objectExpression(props);
|
||||
}
|
||||
if (type == 'ProtectedFields') {
|
||||
const prop = t.objectProperty(
|
||||
t.stringLiteral('_User'), t.objectPattern([
|
||||
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
source ~/.nvm/nvm.sh
|
||||
|
||||
echo "[SCRIPT] Before Install Script :: Setup Postgres ${POSTGRES_MAJOR_VERSION}"
|
||||
|
||||
nvm install $NODE_VERSION
|
||||
nvm use $NODE_VERSION
|
||||
npm install -g greenkeeper-lockfile@1
|
||||
|
||||
if [[ $POSTGRES_MAJOR_VERSION -lt 11 ]]; then
|
||||
# Setup postgres 9 or 10
|
||||
sudo sed -i 's/port = 5432/port = 5433/' /etc/postgresql/${POSTGRES_MAJOR_VERSION}/main/postgresql.conf
|
||||
|
||||
# Stop the current running service
|
||||
sudo service postgresql stop
|
||||
|
||||
# Remove correct version of postgres
|
||||
if [[ $POSTGRES_MAJOR_VERSION -lt 10 ]]; then
|
||||
sudo apt-get remove -q 'postgresql-10.*'
|
||||
else
|
||||
sudo apt-get remove -q 'postgresql-9.*'
|
||||
fi
|
||||
|
||||
sudo service postgresql start
|
||||
|
||||
else
|
||||
# Setup postgres 11 or higher
|
||||
|
||||
#Copy defauilt hba config file and tell postgres to restart
|
||||
sudo cp /etc/postgresql/{10,${POSTGRES_MAJOR_VERSION}}/main/pg_hba.conf
|
||||
sudo systemctl restart postgresql@${POSTGRES_MAJOR_VERSION}-main
|
||||
fi
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "[SCRIPT] Before Script :: Setup Parse DB for Postgres ${POSTGRES_MAJOR_VERSION}"
|
||||
|
||||
node -e 'require("./lib/index.js")'
|
||||
greenkeeper-lockfile-update
|
||||
|
||||
psql -v ON_ERROR_STOP=1 -p 5433 --username "postgres" --dbname "${POSTGRES_DB}" <<-EOSQL
|
||||
CREATE DATABASE parse_server_postgres_adapter_test_database;
|
||||
\c parse_server_postgres_adapter_test_database;
|
||||
CREATE EXTENSION postgis;
|
||||
CREATE EXTENSION postgis_topology;
|
||||
EOSQL
|
||||
+550
-140
@@ -19,13 +19,12 @@ const responses = {
|
||||
microsoft: { id: 'userId', mail: 'userMail' },
|
||||
};
|
||||
|
||||
describe('AuthenticationProviders', function() {
|
||||
describe('AuthenticationProviders', function () {
|
||||
[
|
||||
'apple',
|
||||
'gcenter',
|
||||
'gpgames',
|
||||
'facebook',
|
||||
'facebookaccountkit',
|
||||
'github',
|
||||
'instagram',
|
||||
'google',
|
||||
@@ -42,7 +41,8 @@ describe('AuthenticationProviders', function() {
|
||||
'weibo',
|
||||
'phantauth',
|
||||
'microsoft',
|
||||
].map(function(providerName) {
|
||||
'keycloak',
|
||||
].map(function (providerName) {
|
||||
it('Should validate structure of ' + providerName, done => {
|
||||
const provider = require('../lib/Adapters/Auth/' + providerName);
|
||||
jequal(typeof provider.validateAuthData, 'function');
|
||||
@@ -66,7 +66,7 @@ describe('AuthenticationProviders', function() {
|
||||
});
|
||||
|
||||
it(`should provide the right responses for adapter ${providerName}`, async () => {
|
||||
const noResponse = ['twitter', 'apple', 'gcenter'];
|
||||
const noResponse = ['twitter', 'apple', 'gcenter', 'google', 'keycloak'];
|
||||
if (noResponse.includes(providerName)) {
|
||||
return;
|
||||
}
|
||||
@@ -101,7 +101,7 @@ describe('AuthenticationProviders', function() {
|
||||
});
|
||||
});
|
||||
|
||||
const getMockMyOauthProvider = function() {
|
||||
const getMockMyOauthProvider = function () {
|
||||
return {
|
||||
authData: {
|
||||
id: '12345',
|
||||
@@ -114,7 +114,7 @@ describe('AuthenticationProviders', function() {
|
||||
synchronizedAuthToken: null,
|
||||
synchronizedExpiration: null,
|
||||
|
||||
authenticate: function(options) {
|
||||
authenticate: function (options) {
|
||||
if (this.shouldError) {
|
||||
options.error(this, 'An error occurred');
|
||||
} else if (this.shouldCancel) {
|
||||
@@ -123,7 +123,7 @@ describe('AuthenticationProviders', function() {
|
||||
options.success(this, this.authData);
|
||||
}
|
||||
},
|
||||
restoreAuthentication: function(authData) {
|
||||
restoreAuthentication: function (authData) {
|
||||
if (!authData) {
|
||||
this.synchronizedUserId = null;
|
||||
this.synchronizedAuthToken = null;
|
||||
@@ -135,10 +135,10 @@ describe('AuthenticationProviders', function() {
|
||||
this.synchronizedExpiration = authData.expiration_date;
|
||||
return true;
|
||||
},
|
||||
getAuthType: function() {
|
||||
getAuthType: function () {
|
||||
return 'myoauth';
|
||||
},
|
||||
deauthenticate: function() {
|
||||
deauthenticate: function () {
|
||||
this.loggedOut = true;
|
||||
this.restoreAuthentication(null);
|
||||
},
|
||||
@@ -146,16 +146,16 @@ describe('AuthenticationProviders', function() {
|
||||
};
|
||||
|
||||
Parse.User.extend({
|
||||
extended: function() {
|
||||
extended: function () {
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
const createOAuthUser = function(callback) {
|
||||
const createOAuthUser = function (callback) {
|
||||
return createOAuthUserWithSessionToken(undefined, callback);
|
||||
};
|
||||
|
||||
const createOAuthUserWithSessionToken = function(token, callback) {
|
||||
const createOAuthUserWithSessionToken = function (token, callback) {
|
||||
const jsonBody = {
|
||||
authData: {
|
||||
myoauth: getMockMyOauthProvider().authData,
|
||||
@@ -336,10 +336,10 @@ describe('AuthenticationProviders', function() {
|
||||
token: 'world',
|
||||
};
|
||||
const adapter = {
|
||||
validateAppId: function() {
|
||||
validateAppId: function () {
|
||||
return Promise.resolve();
|
||||
},
|
||||
validateAuthData: function(authData) {
|
||||
validateAuthData: function (authData) {
|
||||
if (
|
||||
authData.id == validAuthData.id &&
|
||||
authData.token == validAuthData.token
|
||||
@@ -359,13 +359,16 @@ describe('AuthenticationProviders', function() {
|
||||
|
||||
validateAuthenticationHandler(authenticationHandler);
|
||||
const validator = authenticationHandler.getValidatorForProvider(
|
||||
'customAuthentication'
|
||||
'customAuthentication',
|
||||
{ requestObject: true }
|
||||
);
|
||||
validateValidator(validator);
|
||||
|
||||
validator(validAuthData).then(
|
||||
() => {
|
||||
expect(authDataSpy).toHaveBeenCalled();
|
||||
expect(authDataSpy).toHaveBeenCalledWith(validAuthData, adapter, {
|
||||
requestObject: true,
|
||||
});
|
||||
// AppIds are not provided in the adapter, should not be called
|
||||
expect(appIdSpy).not.toHaveBeenCalled();
|
||||
done();
|
||||
@@ -512,146 +515,163 @@ describe('AuthenticationProviders', function() {
|
||||
expect(appIds).toEqual(['a', 'b']);
|
||||
expect(providerOptions).toEqual(options.custom);
|
||||
});
|
||||
});
|
||||
|
||||
it('properly loads Facebook accountkit adapter with options', () => {
|
||||
const options = {
|
||||
facebookaccountkit: {
|
||||
appIds: ['a', 'b'],
|
||||
appSecret: 'secret',
|
||||
},
|
||||
};
|
||||
const {
|
||||
adapter,
|
||||
appIds,
|
||||
providerOptions,
|
||||
} = authenticationLoader.loadAuthAdapter('facebookaccountkit', options);
|
||||
validateAuthenticationAdapter(adapter);
|
||||
expect(appIds).toEqual(['a', 'b']);
|
||||
expect(providerOptions.appSecret).toEqual('secret');
|
||||
describe('instagram auth adapter', () => {
|
||||
const instagram = require('../lib/Adapters/Auth/instagram');
|
||||
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
||||
|
||||
it('should use default api', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ data: { id: 'userId' } });
|
||||
});
|
||||
await instagram.validateAuthData(
|
||||
{ id: 'userId', access_token: 'the_token' },
|
||||
{}
|
||||
);
|
||||
expect(httpsRequest.get).toHaveBeenCalledWith(
|
||||
'https://graph.instagram.com/me?fields=id&access_token=the_token'
|
||||
);
|
||||
});
|
||||
|
||||
it('should fail if Facebook appIds is not configured properly', done => {
|
||||
const options = {
|
||||
facebookaccountkit: {
|
||||
appIds: [],
|
||||
},
|
||||
};
|
||||
const { adapter, appIds } = authenticationLoader.loadAuthAdapter(
|
||||
'facebookaccountkit',
|
||||
options
|
||||
);
|
||||
adapter.validateAppId(appIds).then(done.fail, err => {
|
||||
expect(err.code).toBe(Parse.Error.OBJECT_NOT_FOUND);
|
||||
done();
|
||||
it('should pass in api url', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ data: { id: 'userId' } });
|
||||
});
|
||||
});
|
||||
|
||||
it('should fail to validate Facebook accountkit auth with bad token', done => {
|
||||
const options = {
|
||||
facebookaccountkit: {
|
||||
appIds: ['a', 'b'],
|
||||
await instagram.validateAuthData(
|
||||
{
|
||||
id: 'userId',
|
||||
access_token: 'the_token',
|
||||
apiURL: 'https://new-api.instagram.com/v1/',
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'badtoken',
|
||||
};
|
||||
const { adapter } = authenticationLoader.loadAuthAdapter(
|
||||
'facebookaccountkit',
|
||||
options
|
||||
{}
|
||||
);
|
||||
adapter.validateAuthData(authData).then(done.fail, err => {
|
||||
expect(err.code).toBe(190);
|
||||
expect(err.type).toBe('OAuthException');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should fail to validate Facebook accountkit auth with bad token regardless of app secret proof', done => {
|
||||
const options = {
|
||||
facebookaccountkit: {
|
||||
appIds: ['a', 'b'],
|
||||
appSecret: 'badsecret',
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'badtoken',
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'facebookaccountkit',
|
||||
options
|
||||
expect(httpsRequest.get).toHaveBeenCalledWith(
|
||||
'https://new-api.instagram.com/v1/me?fields=id&access_token=the_token'
|
||||
);
|
||||
adapter.validateAuthData(authData, providerOptions).then(done.fail, err => {
|
||||
expect(err.code).toBe(190);
|
||||
expect(err.type).toBe('OAuthException');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('google auth adapter', () => {
|
||||
const google = require('../lib/Adapters/Auth/google');
|
||||
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
||||
const jwt = require('jsonwebtoken');
|
||||
|
||||
it('should use id_token for validation is passed', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ sub: 'userId' });
|
||||
});
|
||||
await google.validateAuthData({ id: 'userId', id_token: 'the_token' }, {});
|
||||
});
|
||||
|
||||
it('should use id_token for validation is passed and responds with user_id', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ user_id: 'userId' });
|
||||
});
|
||||
await google.validateAuthData({ id: 'userId', id_token: 'the_token' }, {});
|
||||
});
|
||||
|
||||
it('should use access_token for validation is passed and responds with user_id', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ user_id: 'userId' });
|
||||
});
|
||||
await google.validateAuthData(
|
||||
{ id: 'userId', access_token: 'the_token' },
|
||||
{}
|
||||
);
|
||||
});
|
||||
|
||||
it('should use access_token for validation is passed with sub', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ sub: 'userId' });
|
||||
});
|
||||
await google.validateAuthData({ id: 'userId', id_token: 'the_token' }, {});
|
||||
});
|
||||
|
||||
it('should fail when the id_token is invalid', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ sub: 'badId' });
|
||||
});
|
||||
it('should throw error with missing id_token', async () => {
|
||||
try {
|
||||
await google.validateAuthData(
|
||||
{ id: 'userId', id_token: 'the_token' },
|
||||
{}
|
||||
);
|
||||
await google.validateAuthData({}, {});
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Google auth is invalid for this user.');
|
||||
expect(e.message).toBe('id token is invalid for this user.');
|
||||
}
|
||||
});
|
||||
|
||||
it('should fail when the access_token is invalid', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({ sub: 'badId' });
|
||||
});
|
||||
it('should not decode invalid id_token', async () => {
|
||||
try {
|
||||
await google.validateAuthData(
|
||||
{ id: 'userId', access_token: 'the_token' },
|
||||
{ id: 'the_user_id', id_token: 'the_token' },
|
||||
{}
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Google auth is invalid for this user.');
|
||||
expect(e.message).toBe('provided token does not decode as JWT');
|
||||
}
|
||||
});
|
||||
|
||||
// it('should throw error if public key used to encode token is not available', async () => {
|
||||
// const fakeDecodedToken = { header: { kid: '789', alg: 'RS256' } };
|
||||
// try {
|
||||
// spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
|
||||
// await google.validateAuthData({ id: 'the_user_id', id_token: 'the_token' }, {});
|
||||
// fail();
|
||||
// } catch (e) {
|
||||
// expect(e.message).toBe(
|
||||
// `Unable to find matching key for Key ID: ${fakeDecodedToken.header.kid}`
|
||||
// );
|
||||
// }
|
||||
// });
|
||||
|
||||
it('(using client id as string) should verify id_token', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://accounts.google.com',
|
||||
aud: 'secret',
|
||||
exp: Date.now(),
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
const result = await google.validateAuthData(
|
||||
{ id: 'the_user_id', id_token: 'the_token' },
|
||||
{ clientId: 'secret' }
|
||||
);
|
||||
expect(result).toEqual(fakeClaim);
|
||||
});
|
||||
|
||||
it('(using client id as string) should throw error with with invalid jwt issuer', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://not.google.com',
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
try {
|
||||
await google.validateAuthData(
|
||||
{ id: 'the_user_id', id_token: 'the_token' },
|
||||
{ clientId: 'secret' }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe(
|
||||
'id token not issued by correct provider - expected: accounts.google.com or https://accounts.google.com | from: https://not.google.com'
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
xit('(using client id as string) should throw error with invalid jwt client_id', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://accounts.google.com',
|
||||
aud: 'secret',
|
||||
exp: Date.now(),
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
try {
|
||||
await google.validateAuthData(
|
||||
{ id: 'INSERT ID HERE', token: 'INSERT APPLE TOKEN HERE' },
|
||||
{ clientId: 'secret' }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('jwt audience invalid. expected: secret');
|
||||
}
|
||||
});
|
||||
|
||||
xit('should throw error with invalid user id', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://accounts.google.com',
|
||||
aud: 'secret',
|
||||
exp: Date.now(),
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
try {
|
||||
await google.validateAuthData(
|
||||
{ id: 'invalid user', token: 'INSERT APPLE TOKEN HERE' },
|
||||
{ clientId: 'INSERT CLIENT ID HERE' }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('auth data is invalid for this user.');
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -687,6 +707,255 @@ describe('google play games service auth', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('keycloak auth adapter', () => {
|
||||
const keycloak = require('../lib/Adapters/Auth/keycloak');
|
||||
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
||||
|
||||
it('validateAuthData should fail without access token', async () => {
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
};
|
||||
try {
|
||||
await keycloak.validateAuthData(authData);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Missing access token and/or User id');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail without user id', async () => {
|
||||
const authData = {
|
||||
access_token: 'sometoken',
|
||||
};
|
||||
try {
|
||||
await keycloak.validateAuthData(authData);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Missing access token and/or User id');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail without config', async () => {
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: null,
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
try {
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Missing keycloak configuration');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail connect error', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.reject({
|
||||
text: JSON.stringify({ error: 'hosting_error' }),
|
||||
});
|
||||
});
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: {
|
||||
'auth-server-url': 'http://example.com',
|
||||
realm: 'new',
|
||||
},
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
try {
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Could not connect to the authentication server');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail with error description', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.reject({
|
||||
text: JSON.stringify({ error_description: 'custom error message' }),
|
||||
});
|
||||
});
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: {
|
||||
'auth-server-url': 'http://example.com',
|
||||
realm: 'new',
|
||||
},
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
try {
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('custom error message');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail with invalid auth', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({});
|
||||
});
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: {
|
||||
'auth-server-url': 'http://example.com',
|
||||
realm: 'new',
|
||||
},
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
try {
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Invalid authentication');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail with invalid groups', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({
|
||||
data: {
|
||||
sub: 'fakeid',
|
||||
roles: ['role1'],
|
||||
groups: ['unknown'],
|
||||
},
|
||||
});
|
||||
});
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: {
|
||||
'auth-server-url': 'http://example.com',
|
||||
realm: 'new',
|
||||
},
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
roles: ['role1'],
|
||||
groups: ['group1'],
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
try {
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Invalid authentication');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should fail with invalid roles', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({
|
||||
data: {
|
||||
sub: 'fakeid',
|
||||
roles: 'unknown',
|
||||
groups: ['group1'],
|
||||
},
|
||||
});
|
||||
});
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: {
|
||||
'auth-server-url': 'http://example.com',
|
||||
realm: 'new',
|
||||
},
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
roles: ['role1'],
|
||||
groups: ['group1'],
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
try {
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('Invalid authentication');
|
||||
}
|
||||
});
|
||||
|
||||
it('validateAuthData should handle authentication', async () => {
|
||||
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||
return Promise.resolve({
|
||||
data: {
|
||||
sub: 'fakeid',
|
||||
roles: ['role1'],
|
||||
groups: ['group1'],
|
||||
},
|
||||
});
|
||||
});
|
||||
const options = {
|
||||
keycloak: {
|
||||
config: {
|
||||
'auth-server-url': 'http://example.com',
|
||||
realm: 'new',
|
||||
},
|
||||
},
|
||||
};
|
||||
const authData = {
|
||||
id: 'fakeid',
|
||||
access_token: 'sometoken',
|
||||
roles: ['role1'],
|
||||
groups: ['group1'],
|
||||
};
|
||||
const { adapter, providerOptions } = authenticationLoader.loadAuthAdapter(
|
||||
'keycloak',
|
||||
options
|
||||
);
|
||||
await adapter.validateAuthData(authData, providerOptions);
|
||||
expect(httpsRequest.get).toHaveBeenCalledWith({
|
||||
host: 'http://example.com',
|
||||
path: '/realms/new/protocol/openid-connect/userinfo',
|
||||
headers: {
|
||||
Authorization: 'Bearer sometoken',
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('oauth2 auth adapter', () => {
|
||||
const oauth2 = require('../lib/Adapters/Auth/oauth2');
|
||||
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
||||
@@ -1138,7 +1407,7 @@ describe('apple signin auth adapter', () => {
|
||||
const jwt = require('jsonwebtoken');
|
||||
const util = require('util');
|
||||
|
||||
it('should throw error with missing id_token', async () => {
|
||||
it('(using client id as string) should throw error with missing id_token', async () => {
|
||||
try {
|
||||
await apple.validateAuthData({}, { clientId: 'secret' });
|
||||
fail();
|
||||
@@ -1147,6 +1416,15 @@ describe('apple signin auth adapter', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('(using client id as array) should throw error with missing id_token', async () => {
|
||||
try {
|
||||
await apple.validateAuthData({}, { clientId: ['secret'] });
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('id token is invalid for this user.');
|
||||
}
|
||||
});
|
||||
|
||||
it('should not decode invalid id_token', async () => {
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
@@ -1220,7 +1498,19 @@ describe('apple signin auth adapter', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('should verify id_token', async () => {
|
||||
it('(using client id as array) should not verify invalid id_token', async () => {
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
{ id: 'the_user_id', token: 'the_token' },
|
||||
{ clientId: ['secret'] }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('provided token does not decode as JWT');
|
||||
}
|
||||
});
|
||||
|
||||
it('(using client id as string) should verify id_token', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://appleid.apple.com',
|
||||
aud: 'secret',
|
||||
@@ -1242,7 +1532,51 @@ describe('apple signin auth adapter', () => {
|
||||
expect(result).toEqual(fakeClaim);
|
||||
});
|
||||
|
||||
it('should throw error with with invalid jwt issuer', async () => {
|
||||
it('(using client id as array) should verify id_token', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://appleid.apple.com',
|
||||
aud: 'secret',
|
||||
exp: Date.now(),
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
const fakeGetSigningKeyAsyncFunction = () => {
|
||||
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
|
||||
};
|
||||
spyOn(util, 'promisify').and.callFake(() => fakeGetSigningKeyAsyncFunction);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
const result = await apple.validateAuthData(
|
||||
{ id: 'the_user_id', token: 'the_token' },
|
||||
{ clientId: ['secret'] }
|
||||
);
|
||||
expect(result).toEqual(fakeClaim);
|
||||
});
|
||||
|
||||
it('(using client id as array with multiple items) should verify id_token', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://appleid.apple.com',
|
||||
aud: 'secret',
|
||||
exp: Date.now(),
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
const fakeGetSigningKeyAsyncFunction = () => {
|
||||
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
|
||||
};
|
||||
spyOn(util, 'promisify').and.callFake(() => fakeGetSigningKeyAsyncFunction);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
const result = await apple.validateAuthData(
|
||||
{ id: 'the_user_id', token: 'the_token' },
|
||||
{ clientId: ['secret', 'secret 123'] }
|
||||
);
|
||||
expect(result).toEqual(fakeClaim);
|
||||
});
|
||||
|
||||
it('(using client id as string) should throw error with with invalid jwt issuer', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://not.apple.com',
|
||||
sub: 'the_user_id',
|
||||
@@ -1268,10 +1602,11 @@ describe('apple signin auth adapter', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('should throw error with with invalid jwt client_id', async () => {
|
||||
// TODO: figure out a way to generate our own apple signed tokens, perhaps with a parse apple account
|
||||
// and a private key
|
||||
xit('(using client id as array) should throw error with with invalid jwt issuer', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://appleid.apple.com',
|
||||
aud: 'invalid_client_id',
|
||||
iss: 'https://not.apple.com',
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
@@ -1284,17 +1619,91 @@ describe('apple signin auth adapter', () => {
|
||||
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
{ id: 'the_user_id', token: 'the_token' },
|
||||
{ clientId: 'secret' }
|
||||
{
|
||||
id: 'INSERT ID HERE',
|
||||
token: 'INSERT APPLE TOKEN HERE WITH INVALID JWT ISSUER',
|
||||
},
|
||||
{ clientId: ['INSERT CLIENT ID HERE'] }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe(
|
||||
'jwt aud parameter does not include this client - is: invalid_client_id | expected: secret'
|
||||
'id token not issued by correct OpenID provider - expected: https://appleid.apple.com | from: https://not.apple.com'
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it('(using client id as string) should throw error with with invalid jwt issuer', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://not.apple.com',
|
||||
sub: 'the_user_id',
|
||||
};
|
||||
const fakeDecodedToken = { header: { kid: '123', alg: 'RS256' } };
|
||||
spyOn(jwt, 'decode').and.callFake(() => fakeDecodedToken);
|
||||
const fakeGetSigningKeyAsyncFunction = () => {
|
||||
return { kid: '123', rsaPublicKey: 'the_rsa_public_key' };
|
||||
};
|
||||
spyOn(util, 'promisify').and.callFake(() => fakeGetSigningKeyAsyncFunction);
|
||||
spyOn(jwt, 'verify').and.callFake(() => fakeClaim);
|
||||
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
{
|
||||
id: 'INSERT ID HERE',
|
||||
token: 'INSERT APPLE TOKEN HERE WITH INVALID JWT ISSUER',
|
||||
},
|
||||
{ clientId: 'INSERT CLIENT ID HERE' }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe(
|
||||
'id token not issued by correct OpenID provider - expected: https://appleid.apple.com | from: https://not.apple.com'
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
// TODO: figure out a way to generate our own apple signed tokens, perhaps with a parse apple account
|
||||
// and a private key
|
||||
xit('(using client id as string) should throw error with invalid jwt clientId', async () => {
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
{ id: 'INSERT ID HERE', token: 'INSERT APPLE TOKEN HERE' },
|
||||
{ clientId: 'secret' }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('jwt audience invalid. expected: secret');
|
||||
}
|
||||
});
|
||||
|
||||
// TODO: figure out a way to generate our own apple signed tokens, perhaps with a parse apple account
|
||||
// and a private key
|
||||
xit('(using client id as array) should throw error with invalid jwt clientId', async () => {
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
{ id: 'INSERT ID HERE', token: 'INSERT APPLE TOKEN HERE' },
|
||||
{ clientId: ['secret'] }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('jwt audience invalid. expected: secret');
|
||||
}
|
||||
});
|
||||
|
||||
// TODO: figure out a way to generate our own apple signed tokens, perhaps with a parse apple account
|
||||
// and a private key
|
||||
xit('should throw error with invalid user id', async () => {
|
||||
try {
|
||||
await apple.validateAuthData(
|
||||
{ id: 'invalid user', token: 'INSERT APPLE TOKEN HERE' },
|
||||
{ clientId: 'INSERT CLIENT ID HERE' }
|
||||
);
|
||||
fail();
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('auth data is invalid for this user.');
|
||||
}
|
||||
});
|
||||
|
||||
it('should throw error with with invalid user id', async () => {
|
||||
const fakeClaim = {
|
||||
iss: 'https://appleid.apple.com',
|
||||
@@ -1320,6 +1729,7 @@ describe('apple signin auth adapter', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('Apple Game Center Auth adapter', () => {
|
||||
const gcenter = require('../lib/Adapters/Auth/gcenter');
|
||||
|
||||
|
||||
+531
-136
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
const DatabaseController = require('../lib/Controllers/DatabaseController.js');
|
||||
const validateQuery = DatabaseController._validateQuery;
|
||||
|
||||
describe('DatabaseController', function() {
|
||||
describe('validateQuery', function() {
|
||||
describe('DatabaseController', function () {
|
||||
describe('validateQuery', function () {
|
||||
it('should not restructure simple cases of SERVER-13732', done => {
|
||||
const query = {
|
||||
$or: [{ a: 1 }, { a: 2 }],
|
||||
@@ -55,4 +55,264 @@ describe('DatabaseController', function() {
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
describe('addPointerPermissions', function () {
|
||||
const CLASS_NAME = 'Foo';
|
||||
const USER_ID = 'userId';
|
||||
const ACL_GROUP = [USER_ID];
|
||||
const OPERATION = 'find';
|
||||
|
||||
const databaseController = new DatabaseController();
|
||||
const schemaController = jasmine.createSpyObj('SchemaController', [
|
||||
'testPermissionsForClassName',
|
||||
'getClassLevelPermissions',
|
||||
'getExpectedType',
|
||||
]);
|
||||
|
||||
it('should not decorate query if no pointer CLPs are present', done => {
|
||||
const clp = buildCLP();
|
||||
const query = { a: 'b' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(true);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
|
||||
const output = databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
|
||||
expect(output).toEqual({ ...query });
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should decorate query if a pointer CLP entry is present', done => {
|
||||
const clp = buildCLP(['user']);
|
||||
const query = { a: 'b' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(false);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'user')
|
||||
.and.returnValue({ type: 'Pointer' });
|
||||
|
||||
const output = databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
|
||||
expect(output).toEqual({ ...query, user: createUserPointer(USER_ID) });
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should decorate query if an array CLP entry is present', done => {
|
||||
const clp = buildCLP(['users']);
|
||||
const query = { a: 'b' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(false);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'users')
|
||||
.and.returnValue({ type: 'Array' });
|
||||
|
||||
const output = databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
|
||||
expect(output).toEqual({
|
||||
...query,
|
||||
users: { $all: [createUserPointer(USER_ID)] },
|
||||
});
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should decorate query if an object CLP entry is present', done => {
|
||||
const clp = buildCLP(['user']);
|
||||
const query = { a: 'b' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(false);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'user')
|
||||
.and.returnValue({ type: 'Object' });
|
||||
|
||||
const output = databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
|
||||
expect(output).toEqual({
|
||||
...query,
|
||||
user: createUserPointer(USER_ID),
|
||||
});
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should decorate query if a pointer CLP is present and the same field is part of the query', done => {
|
||||
const clp = buildCLP(['user']);
|
||||
const query = { a: 'b', user: 'a' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(false);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'user')
|
||||
.and.returnValue({ type: 'Pointer' });
|
||||
|
||||
const output = databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
|
||||
expect(output).toEqual({
|
||||
$and: [{ user: createUserPointer(USER_ID) }, { ...query }],
|
||||
});
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should transform the query to an $or query if multiple array/pointer CLPs are present', done => {
|
||||
const clp = buildCLP(['user', 'users', 'userObject']);
|
||||
const query = { a: 'b' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(false);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'user')
|
||||
.and.returnValue({ type: 'Pointer' });
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'users')
|
||||
.and.returnValue({ type: 'Array' });
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'userObject')
|
||||
.and.returnValue({ type: 'Object' });
|
||||
|
||||
const output = databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
|
||||
expect(output).toEqual({
|
||||
$or: [
|
||||
{ ...query, user: createUserPointer(USER_ID) },
|
||||
{ ...query, users: { $all: [createUserPointer(USER_ID)] } },
|
||||
{ ...query, userObject: createUserPointer(USER_ID) },
|
||||
],
|
||||
});
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should throw an error if for some unexpected reason the property specified in the CLP is neither a pointer nor an array', done => {
|
||||
const clp = buildCLP(['user']);
|
||||
const query = { a: 'b' };
|
||||
|
||||
schemaController.testPermissionsForClassName
|
||||
.withArgs(CLASS_NAME, ACL_GROUP, OPERATION)
|
||||
.and.returnValue(false);
|
||||
schemaController.getClassLevelPermissions
|
||||
.withArgs(CLASS_NAME)
|
||||
.and.returnValue(clp);
|
||||
schemaController.getExpectedType
|
||||
.withArgs(CLASS_NAME, 'user')
|
||||
.and.returnValue({ type: 'Number' });
|
||||
|
||||
expect(() => {
|
||||
databaseController.addPointerPermissions(
|
||||
schemaController,
|
||||
CLASS_NAME,
|
||||
OPERATION,
|
||||
query,
|
||||
ACL_GROUP
|
||||
);
|
||||
}).toThrow(
|
||||
Error(
|
||||
`An unexpected condition occurred when resolving pointer permissions: ${CLASS_NAME} user`
|
||||
)
|
||||
);
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function buildCLP(pointerNames) {
|
||||
const OPERATIONS = [
|
||||
'count',
|
||||
'find',
|
||||
'get',
|
||||
'create',
|
||||
'update',
|
||||
'delete',
|
||||
'addField',
|
||||
];
|
||||
|
||||
const clp = OPERATIONS.reduce((acc, op) => {
|
||||
acc[op] = {};
|
||||
|
||||
if (pointerNames && pointerNames.length) {
|
||||
acc[op].pointerFields = pointerNames;
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
clp.protectedFields = {};
|
||||
clp.writeUserFields = [];
|
||||
clp.readUserFields = [];
|
||||
|
||||
return clp;
|
||||
}
|
||||
|
||||
function createUserPointer(userId) {
|
||||
return {
|
||||
__type: 'Pointer',
|
||||
className: '_User',
|
||||
objectId: userId,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,63 +1,33 @@
|
||||
const ParseServer = require('../lib/index');
|
||||
const express = require('express');
|
||||
const request = require('../lib/request');
|
||||
|
||||
describe('Enable express error handler', () => {
|
||||
it('should call the default handler in case of error, like updating a non existing object', done => {
|
||||
const serverUrl = 'http://localhost:12667/parse';
|
||||
const appId = 'anOtherTestApp';
|
||||
const masterKey = 'anOtherTestMasterKey';
|
||||
let server;
|
||||
|
||||
let lastError;
|
||||
|
||||
const parseServer = ParseServer.ParseServer(
|
||||
it('should call the default handler in case of error, like updating a non existing object', async (done) => {
|
||||
const parseServer = await reconfigureServer(
|
||||
Object.assign({}, defaultConfiguration, {
|
||||
appId: appId,
|
||||
masterKey: masterKey,
|
||||
serverURL: serverUrl,
|
||||
enableExpressErrorHandler: true,
|
||||
serverStartComplete: () => {
|
||||
expect(Parse.applicationId).toEqual('anOtherTestApp');
|
||||
const app = express();
|
||||
app.use('/parse', parseServer);
|
||||
|
||||
server = app.listen(12667);
|
||||
|
||||
app.use(function(err, req, res, next) {
|
||||
next;
|
||||
lastError = err;
|
||||
});
|
||||
|
||||
request({
|
||||
method: 'PUT',
|
||||
url: serverUrl + '/classes/AnyClass/nonExistingId',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': appId,
|
||||
'X-Parse-Master-Key': masterKey,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: { someField: 'blablabla' },
|
||||
})
|
||||
.then(() => {
|
||||
fail('Should throw error');
|
||||
})
|
||||
.catch(response => {
|
||||
const reqError = response.data;
|
||||
expect(reqError).toBeDefined();
|
||||
expect(lastError).toBeDefined();
|
||||
|
||||
expect(lastError.code).toEqual(101);
|
||||
expect(lastError.message).toEqual('Object not found.');
|
||||
|
||||
expect(lastError.code).toEqual(reqError.code);
|
||||
expect(lastError.message).toEqual(reqError.error);
|
||||
})
|
||||
.then(() => {
|
||||
server.close(done);
|
||||
});
|
||||
},
|
||||
})
|
||||
);
|
||||
parseServer.app.use(function (err, req, res, next) {
|
||||
expect(err.message).toBe('Object not found.');
|
||||
next(err);
|
||||
});
|
||||
|
||||
try {
|
||||
await request({
|
||||
method: 'PUT',
|
||||
url: defaultConfiguration.serverURL + '/classes/AnyClass/nonExistingId',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': defaultConfiguration.appId,
|
||||
'X-Parse-Master-Key': defaultConfiguration.masterKey,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: { someField: 'blablabla' },
|
||||
});
|
||||
fail('Should throw error');
|
||||
} catch (response) {
|
||||
expect(response).toBeDefined();
|
||||
expect(response.status).toEqual(500);
|
||||
parseServer.server.close(done);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -8,6 +8,7 @@ const GridStoreAdapter = require('../lib/Adapters/Files/GridStoreAdapter')
|
||||
.GridStoreAdapter;
|
||||
const Config = require('../lib/Config');
|
||||
const FilesController = require('../lib/Controllers/FilesController').default;
|
||||
const databaseURI = 'mongodb://localhost:27017/parse';
|
||||
|
||||
const mockAdapter = {
|
||||
createFile: () => {
|
||||
@@ -29,7 +30,7 @@ describe('FilesController', () => {
|
||||
'mongodb://localhost:27017/parse'
|
||||
);
|
||||
const filesController = new FilesController(gridStoreAdapter);
|
||||
const result = filesController.expandFilesInObject(config, function() {});
|
||||
const result = filesController.expandFilesInObject(config, function () {});
|
||||
|
||||
expect(result).toBeUndefined();
|
||||
|
||||
@@ -65,13 +66,11 @@ describe('FilesController', () => {
|
||||
// and 2 the message that will be sent back to the client.
|
||||
|
||||
const log1 = logs.find(
|
||||
x => x.message === 'Error creating a file: it failed with xyz'
|
||||
x => x.message === 'Error creating a file: it failed with xyz'
|
||||
);
|
||||
expect(log1.level).toBe('error');
|
||||
|
||||
const log2 = logs.find(
|
||||
x => x.message === 'Could not store file: yolo.txt.'
|
||||
);
|
||||
const log2 = logs.find(x => x.message === 'it failed with xyz');
|
||||
expect(log2.level).toBe('error');
|
||||
expect(log2.code).toBe(130);
|
||||
|
||||
@@ -137,6 +136,15 @@ describe('FilesController', () => {
|
||||
done();
|
||||
});
|
||||
|
||||
it('should handle adapter without getMetadata', async () => {
|
||||
const gridStoreAdapter = new GridFSBucketAdapter(databaseURI);
|
||||
gridStoreAdapter.getMetadata = null;
|
||||
const filesController = new FilesController(gridStoreAdapter);
|
||||
|
||||
const result = await filesController.getMetadata();
|
||||
expect(result).toEqual({});
|
||||
});
|
||||
|
||||
it('should reject slashes in file names', done => {
|
||||
const gridStoreAdapter = new GridFSBucketAdapter(
|
||||
'mongodb://localhost:27017/parse'
|
||||
|
||||
@@ -4,6 +4,8 @@ const GridFSBucketAdapter = require('../lib/Adapters/Files/GridFSBucketAdapter')
|
||||
.GridFSBucketAdapter;
|
||||
const { randomString } = require('../lib/cryptoUtils');
|
||||
const databaseURI = 'mongodb://localhost:27017/parse';
|
||||
const request = require('../lib/request');
|
||||
const Config = require('../lib/Config');
|
||||
|
||||
async function expectMissingFile(gfsAdapter, name) {
|
||||
try {
|
||||
@@ -14,7 +16,7 @@ async function expectMissingFile(gfsAdapter, name) {
|
||||
}
|
||||
}
|
||||
|
||||
describe('GridFSBucket and GridStore interop', () => {
|
||||
describe_only_db('mongo')('GridFSBucket and GridStore interop', () => {
|
||||
beforeEach(async () => {
|
||||
const gsAdapter = new GridStoreAdapter(databaseURI);
|
||||
const db = await gsAdapter._connect();
|
||||
@@ -33,6 +35,89 @@ describe('GridFSBucket and GridStore interop', () => {
|
||||
expect(gfsResult.toString('utf8')).toBe(originalString);
|
||||
});
|
||||
|
||||
it('an encypted file created in GridStore should be available in GridFS', async () => {
|
||||
const gsAdapter = new GridStoreAdapter(databaseURI);
|
||||
const gfsAdapter = new GridFSBucketAdapter(
|
||||
databaseURI,
|
||||
{},
|
||||
'89E4AFF1-DFE4-4603-9574-BFA16BB446FD'
|
||||
);
|
||||
await expectMissingFile(gfsAdapter, 'myFileName');
|
||||
const originalString = 'abcdefghi';
|
||||
await gfsAdapter.createFile('myFileName', originalString);
|
||||
const gsResult = await gsAdapter.getFileData('myFileName');
|
||||
expect(gsResult.toString('utf8')).not.toBe(originalString);
|
||||
const gfsResult = await gfsAdapter.getFileData('myFileName');
|
||||
expect(gfsResult.toString('utf8')).toBe(originalString);
|
||||
});
|
||||
|
||||
it('should save metadata', async () => {
|
||||
const gfsAdapter = new GridFSBucketAdapter(databaseURI);
|
||||
const originalString = 'abcdefghi';
|
||||
const metadata = { hello: 'world' };
|
||||
await gfsAdapter.createFile('myFileName', originalString, null, {
|
||||
metadata,
|
||||
});
|
||||
const gfsResult = await gfsAdapter.getFileData('myFileName');
|
||||
expect(gfsResult.toString('utf8')).toBe(originalString);
|
||||
let gfsMetadata = await gfsAdapter.getMetadata('myFileName');
|
||||
expect(gfsMetadata.metadata).toEqual(metadata);
|
||||
|
||||
// Empty json for file not found
|
||||
gfsMetadata = await gfsAdapter.getMetadata('myUnknownFile');
|
||||
expect(gfsMetadata).toEqual({});
|
||||
});
|
||||
|
||||
it('should save metadata with file', async () => {
|
||||
const gfsAdapter = new GridFSBucketAdapter(databaseURI);
|
||||
await reconfigureServer({ filesAdapter: gfsAdapter });
|
||||
const str = 'Hello World!';
|
||||
const data = [];
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
data.push(str.charCodeAt(i));
|
||||
}
|
||||
const metadata = { foo: 'bar' };
|
||||
const file = new Parse.File('hello.txt', data, 'text/plain');
|
||||
file.addMetadata('foo', 'bar');
|
||||
await file.save();
|
||||
let fileData = await gfsAdapter.getMetadata(file.name());
|
||||
expect(fileData.metadata).toEqual(metadata);
|
||||
|
||||
// Can only add metadata on create
|
||||
file.addMetadata('hello', 'world');
|
||||
await file.save();
|
||||
fileData = await gfsAdapter.getMetadata(file.name());
|
||||
expect(fileData.metadata).toEqual(metadata);
|
||||
|
||||
const headers = {
|
||||
'X-Parse-Application-Id': 'test',
|
||||
'X-Parse-REST-API-Key': 'rest',
|
||||
};
|
||||
const response = await request({
|
||||
method: 'GET',
|
||||
headers,
|
||||
url: `http://localhost:8378/1/files/test/metadata/${file.name()}`,
|
||||
});
|
||||
fileData = response.data;
|
||||
expect(fileData.metadata).toEqual(metadata);
|
||||
});
|
||||
|
||||
it('should handle getMetadata error', async () => {
|
||||
const config = Config.get('test');
|
||||
config.filesController.getMetadata = () => Promise.reject();
|
||||
|
||||
const headers = {
|
||||
'X-Parse-Application-Id': 'test',
|
||||
'X-Parse-REST-API-Key': 'rest',
|
||||
};
|
||||
const response = await request({
|
||||
method: 'GET',
|
||||
headers,
|
||||
url: `http://localhost:8378/1/files/test/metadata/filename.txt`,
|
||||
});
|
||||
expect(response.data).toEqual({});
|
||||
});
|
||||
|
||||
it('properly fetches a large file from GridFS', async () => {
|
||||
const gfsAdapter = new GridFSBucketAdapter(databaseURI);
|
||||
const twoMegabytesFile = randomString(2048 * 1024);
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
'use strict';
|
||||
const Config = require('../lib/Config');
|
||||
const Definitions = require('../lib/Options/Definitions');
|
||||
const request = require('../lib/request');
|
||||
const rest = require('../lib/rest');
|
||||
const auth = require('../lib/Auth');
|
||||
const uuid = require('uuid');
|
||||
|
||||
describe_only_db('mongo')('Idempotency', () => {
|
||||
// Parameters
|
||||
/** Enable TTL expiration simulated by removing entry instead of waiting for MongoDB TTL monitor which
|
||||
runs only every 60s, so it can take up to 119s until entry removal - ain't nobody got time for that */
|
||||
const SIMULATE_TTL = true;
|
||||
// Helpers
|
||||
async function deleteRequestEntry(reqId) {
|
||||
const config = Config.get(Parse.applicationId);
|
||||
const res = await rest.find(
|
||||
config,
|
||||
auth.master(config),
|
||||
'_Idempotency',
|
||||
{ reqId: reqId },
|
||||
{ limit: 1 }
|
||||
);
|
||||
await rest.del(
|
||||
config,
|
||||
auth.master(config),
|
||||
'_Idempotency',
|
||||
res.results[0].objectId
|
||||
);
|
||||
}
|
||||
async function setup(options) {
|
||||
await reconfigureServer({
|
||||
appId: Parse.applicationId,
|
||||
masterKey: Parse.masterKey,
|
||||
serverURL: Parse.serverURL,
|
||||
idempotencyOptions: options,
|
||||
});
|
||||
}
|
||||
// Setups
|
||||
beforeEach(async () => {
|
||||
if (SIMULATE_TTL) {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200000;
|
||||
}
|
||||
await setup({
|
||||
paths: [
|
||||
'functions/.*',
|
||||
'jobs/.*',
|
||||
'classes/.*',
|
||||
'users',
|
||||
'installations',
|
||||
],
|
||||
ttl: 30,
|
||||
});
|
||||
});
|
||||
// Tests
|
||||
it('should enforce idempotency for cloud code function', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.define('myFunction', () => {
|
||||
counter++;
|
||||
});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/functions/myFunction',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
expect(Config.get(Parse.applicationId).idempotencyOptions.ttl).toBe(30);
|
||||
await request(params);
|
||||
await request(params).then(fail, e => {
|
||||
expect(e.status).toEqual(400);
|
||||
expect(e.data.error).toEqual('Duplicate request');
|
||||
});
|
||||
expect(counter).toBe(1);
|
||||
});
|
||||
|
||||
it('should delete request entry after TTL', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.define('myFunction', () => {
|
||||
counter++;
|
||||
});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/functions/myFunction',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
await expectAsync(request(params)).toBeResolved();
|
||||
if (SIMULATE_TTL) {
|
||||
await deleteRequestEntry('abc-123');
|
||||
} else {
|
||||
await new Promise(resolve => setTimeout(resolve, 130000));
|
||||
}
|
||||
await expectAsync(request(params)).toBeResolved();
|
||||
expect(counter).toBe(2);
|
||||
});
|
||||
|
||||
it('should enforce idempotency for cloud code jobs', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.job('myJob', () => {
|
||||
counter++;
|
||||
});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/jobs/myJob',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
await expectAsync(request(params)).toBeResolved();
|
||||
await request(params).then(fail, e => {
|
||||
expect(e.status).toEqual(400);
|
||||
expect(e.data.error).toEqual('Duplicate request');
|
||||
});
|
||||
expect(counter).toBe(1);
|
||||
});
|
||||
|
||||
it('should enforce idempotency for class object creation', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.afterSave('MyClass', () => {
|
||||
counter++;
|
||||
});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/classes/MyClass',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
await expectAsync(request(params)).toBeResolved();
|
||||
await request(params).then(fail, e => {
|
||||
expect(e.status).toEqual(400);
|
||||
expect(e.data.error).toEqual('Duplicate request');
|
||||
});
|
||||
expect(counter).toBe(1);
|
||||
});
|
||||
|
||||
it('should enforce idempotency for user object creation', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.afterSave('_User', () => {
|
||||
counter++;
|
||||
});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/users',
|
||||
body: {
|
||||
username: 'user',
|
||||
password: 'pass',
|
||||
},
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
await expectAsync(request(params)).toBeResolved();
|
||||
await request(params).then(fail, e => {
|
||||
expect(e.status).toEqual(400);
|
||||
expect(e.data.error).toEqual('Duplicate request');
|
||||
});
|
||||
expect(counter).toBe(1);
|
||||
});
|
||||
|
||||
it('should enforce idempotency for installation object creation', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.afterSave('_Installation', () => {
|
||||
counter++;
|
||||
});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/installations',
|
||||
body: {
|
||||
installationId: '1',
|
||||
deviceType: 'ios',
|
||||
},
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
await expectAsync(request(params)).toBeResolved();
|
||||
await request(params).then(fail, e => {
|
||||
expect(e.status).toEqual(400);
|
||||
expect(e.data.error).toEqual('Duplicate request');
|
||||
});
|
||||
expect(counter).toBe(1);
|
||||
});
|
||||
|
||||
it('should not interfere with calls of different request ID', async () => {
|
||||
let counter = 0;
|
||||
Parse.Cloud.afterSave('MyClass', () => {
|
||||
counter++;
|
||||
});
|
||||
const promises = [...Array(100).keys()].map(() => {
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/classes/MyClass',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': uuid.v4(),
|
||||
},
|
||||
};
|
||||
return request(params);
|
||||
});
|
||||
await expectAsync(Promise.all(promises)).toBeResolved();
|
||||
expect(counter).toBe(100);
|
||||
});
|
||||
|
||||
it('should re-throw any other error unchanged when writing request entry fails for any other reason', async () => {
|
||||
spyOn(rest, 'create').and.rejectWith(
|
||||
new Parse.Error(0, 'some other error')
|
||||
);
|
||||
Parse.Cloud.define('myFunction', () => {});
|
||||
const params = {
|
||||
method: 'POST',
|
||||
url: 'http://localhost:8378/1/functions/myFunction',
|
||||
headers: {
|
||||
'X-Parse-Application-Id': Parse.applicationId,
|
||||
'X-Parse-Master-Key': Parse.masterKey,
|
||||
'X-Parse-Request-Id': 'abc-123',
|
||||
},
|
||||
};
|
||||
await request(params).then(fail, e => {
|
||||
expect(e.status).toEqual(400);
|
||||
expect(e.data.error).toEqual('some other error');
|
||||
});
|
||||
});
|
||||
|
||||
it('should use default configuration when none is set', async () => {
|
||||
await setup({});
|
||||
expect(Config.get(Parse.applicationId).idempotencyOptions.ttl).toBe(
|
||||
Definitions.IdempotencyOptions.ttl.default
|
||||
);
|
||||
expect(Config.get(Parse.applicationId).idempotencyOptions.paths).toBe(
|
||||
Definitions.IdempotencyOptions.paths.default
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw on invalid configuration', async () => {
|
||||
await expectAsync(setup({ paths: 1 })).toBeRejected();
|
||||
await expectAsync(setup({ ttl: 'a' })).toBeRejected();
|
||||
await expectAsync(setup({ ttl: 0 })).toBeRejected();
|
||||
await expectAsync(setup({ ttl: -1 })).toBeRejected();
|
||||
});
|
||||
});
|
||||
@@ -356,4 +356,60 @@ describe('middlewares', () => {
|
||||
middlewares.DEFAULT_ALLOWED_HEADERS
|
||||
);
|
||||
});
|
||||
|
||||
it('should set default Access-Control-Allow-Origin if allowOrigin is empty', () => {
|
||||
AppCache.put(fakeReq.body._ApplicationId, {
|
||||
allowOrigin: undefined,
|
||||
});
|
||||
const headers = {};
|
||||
const res = {
|
||||
header: (key, value) => {
|
||||
headers[key] = value;
|
||||
},
|
||||
};
|
||||
const allowCrossDomain = middlewares.allowCrossDomain(
|
||||
fakeReq.body._ApplicationId
|
||||
);
|
||||
allowCrossDomain(fakeReq, res, () => {});
|
||||
expect(headers['Access-Control-Allow-Origin']).toEqual('*');
|
||||
});
|
||||
|
||||
it('should set custom origin to Access-Control-Allow-Origin if allowOrigin is provided', () => {
|
||||
AppCache.put(fakeReq.body._ApplicationId, {
|
||||
allowOrigin: 'https://parseplatform.org/',
|
||||
});
|
||||
const headers = {};
|
||||
const res = {
|
||||
header: (key, value) => {
|
||||
headers[key] = value;
|
||||
},
|
||||
};
|
||||
const allowCrossDomain = middlewares.allowCrossDomain(
|
||||
fakeReq.body._ApplicationId
|
||||
);
|
||||
allowCrossDomain(fakeReq, res, () => {});
|
||||
expect(headers['Access-Control-Allow-Origin']).toEqual(
|
||||
'https://parseplatform.org/'
|
||||
);
|
||||
});
|
||||
|
||||
it('should use user provided on field userFromJWT', done => {
|
||||
AppCache.put(fakeReq.body._ApplicationId, {
|
||||
masterKey: 'masterKey',
|
||||
});
|
||||
fakeReq.userFromJWT = 'fake-user';
|
||||
middlewares.handleParseHeaders(fakeReq, fakeRes, () => {
|
||||
expect(fakeReq.auth.user).toEqual('fake-user');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should give invalid response when upload file without x-parse-application-id in header', () => {
|
||||
AppCache.put(fakeReq.body._ApplicationId, {
|
||||
masterKey: 'masterKey',
|
||||
});
|
||||
fakeReq.body = Buffer.from('fake-file');
|
||||
middlewares.handleParseHeaders(fakeReq, fakeRes);
|
||||
expect(fakeRes.status).toHaveBeenCalledWith(403);
|
||||
});
|
||||
});
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user