parse-server 9.0.0-alpha.8 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -79
- package/lib/Adapters/Push/PushAdapter.js +2 -2
- package/lib/Deprecator/Deprecations.js +2 -8
- package/lib/Options/Definitions.js +4 -4
- package/lib/Options/docs.js +2 -2
- package/lib/Options/index.js +1 -1
- package/lib/rest.js +2 -2
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ The full documentation for Parse Server is available in the [wiki](https://githu
|
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
-
A big
|
|
32
|
+
A big _thank you_ 🙏 to our [sponsors](#sponsors) and [backers](#backers) who support the development of Parse Platform!
|
|
33
33
|
|
|
34
34
|
#### Bronze Sponsors
|
|
35
35
|
|
|
@@ -126,7 +126,7 @@ Before you start make sure you have installed:
|
|
|
126
126
|
Parse Server is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
|
|
127
127
|
|
|
128
128
|
| Version | Minimum Version | End-of-Life | Parse Server Support |
|
|
129
|
-
|
|
129
|
+
| ---------- | --------------- | ----------- | -------------------- |
|
|
130
130
|
| Node.js 18 | 18.20.4 | April 2025 | <= 8.x (2025) |
|
|
131
131
|
| Node.js 20 | 20.19.0 | April 2026 | <= 9.x (2026) |
|
|
132
132
|
| Node.js 22 | 22.12.0 | April 2027 | <= 10.x (2027) |
|
|
@@ -137,7 +137,7 @@ Parse Server is continuously tested with the most recent releases of Node.js to
|
|
|
137
137
|
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and [MongoDB lifecycle schedule](https://www.mongodb.com/support-policy/lifecycles) and only test against versions that are officially supported and have not reached their end-of-life date. MongoDB "rapid releases" are ignored as these are considered pre-releases of the next major version.
|
|
138
138
|
|
|
139
139
|
| Version | Minimum Version | End-of-Life | Parse Server Support |
|
|
140
|
-
|
|
140
|
+
| --------- | --------------- | ----------- | -------------------- |
|
|
141
141
|
| MongoDB 6 | 6.0.19 | July 2025 | <= 8.x (2025) |
|
|
142
142
|
| MongoDB 7 | 7.0.16 | August 2026 | <= 9.x (2026) |
|
|
143
143
|
| MongoDB 8 | 8.0.4 | TDB | <= 10.x (2027) |
|
|
@@ -147,7 +147,7 @@ Parse Server is continuously tested with the most recent releases of MongoDB to
|
|
|
147
147
|
Parse Server is continuously tested with the most recent releases of PostgreSQL and PostGIS to ensure compatibility, using [PostGIS docker images](https://registry.hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated). We follow the [PostgreSQL support schedule](https://www.postgresql.org/support/versioning) and [PostGIS support schedule](https://www.postgis.net/eol_policy/) and only test against versions that are officially supported and have not reached their end-of-life date. Due to the extensive PostgreSQL support duration of 5 years, Parse Server drops support about 2 years before the official end-of-life date.
|
|
148
148
|
|
|
149
149
|
| Version | PostGIS Version | End-of-Life | Parse Server Support |
|
|
150
|
-
|
|
150
|
+
| ----------- | ----------------------- | ------------- | -------------------- |
|
|
151
151
|
| Postgres 13 | 3.1, 3.2, 3.3, 3.4, 3.5 | November 2025 | <= 6.x (2023) |
|
|
152
152
|
| Postgres 14 | 3.5 | November 2026 | <= 7.x (2024) |
|
|
153
153
|
| Postgres 15 | 3.3, 3.4, 3.5 | November 2027 | <= 8.x (2025) |
|
|
@@ -162,8 +162,8 @@ $ npm install -g parse-server mongodb-runner
|
|
|
162
162
|
$ mongodb-runner start
|
|
163
163
|
$ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://localhost/test
|
|
164
164
|
```
|
|
165
|
-
***Note:*** *If installation with* `-g` *fails due to permission problems* (`npm ERR! code 'EACCES'`), *please refer to [this link](https://docs.npmjs.com/getting-started/fixing-npm-permissions).*
|
|
166
165
|
|
|
166
|
+
**_Note:_** _If installation with_ `-g` _fails due to permission problems_ (`npm ERR! code 'EACCES'`), _please refer to [this link](https://docs.npmjs.com/getting-started/fixing-npm-permissions)._
|
|
167
167
|
|
|
168
168
|
### Docker Container
|
|
169
169
|
|
|
@@ -180,13 +180,13 @@ $ docker run --name my-mongo -d mongo
|
|
|
180
180
|
$ docker run --name my-parse-server -v config-vol:/parse-server/config -p 1337:1337 --link my-mongo:mongo -d parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongo/test
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
**_Note:_** _If you want to use [Cloud Code](https://docs.parseplatform.org/cloudcode/guide/), add `-v cloud-code-vol:/parse-server/cloud --cloud /parse-server/cloud/main.js` to the command above. Make sure `main.js` is in the `cloud-code-vol` directory before starting Parse Server._
|
|
184
184
|
|
|
185
185
|
You can use any arbitrary string as your application id and master key. These will be used by your clients to authenticate with the Parse Server.
|
|
186
186
|
|
|
187
187
|
That's it! You are now running a standalone version of Parse Server on your machine.
|
|
188
188
|
|
|
189
|
-
**Using a remote MongoDB?** Pass the
|
|
189
|
+
**Using a remote MongoDB?** Pass the `--databaseURI DATABASE_URI` parameter when starting `parse-server`. Learn more about configuring Parse Server [here](#configuration). For a full list of available options, run `parse-server --help`.
|
|
190
190
|
|
|
191
191
|
### Saving and Querying Objects
|
|
192
192
|
|
|
@@ -204,17 +204,17 @@ Once you have a better understanding of how the project works, please refer to t
|
|
|
204
204
|
|
|
205
205
|
We have provided a basic [Node.js application](https://github.com/parse-community/parse-server-example) that uses the Parse Server module on Express and can be easily deployed to various infrastructure providers:
|
|
206
206
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
207
|
+
- [Heroku and mLab](https://devcenter.heroku.com/articles/deploying-a-parse-server-to-heroku)
|
|
208
|
+
- [AWS and Elastic Beanstalk](http://mobile.awsblog.com/post/TxCD57GZLM2JR/How-to-set-up-Parse-Server-on-AWS-using-AWS-Elastic-Beanstalk)
|
|
209
|
+
- [Google App Engine](https://medium.com/@justinbeckwith/deploying-parse-server-to-google-app-engine-6bc0b7451d50)
|
|
210
|
+
- [Microsoft Azure](https://azure.microsoft.com/en-us/blog/azure-welcomes-parse-developers/)
|
|
211
|
+
- [SashiDo](https://blog.sashido.io/tag/migration/)
|
|
212
|
+
- [Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-run-parse-server-on-ubuntu-14-04)
|
|
213
|
+
- [Pivotal Web Services](https://github.com/cf-platform-eng/pws-parse-server)
|
|
214
|
+
- [Back4app](https://www.back4app.com/docs/get-started/welcome)
|
|
215
|
+
- [Glitch](https://glitch.com/edit/#!/parse-server)
|
|
216
|
+
- [Flynn](https://flynn.io/blog/parse-apps-on-flynn)
|
|
217
|
+
- [Elestio](https://elest.io/open-source/parse)
|
|
218
218
|
|
|
219
219
|
### Parse Server + Express
|
|
220
220
|
|
|
@@ -231,7 +231,7 @@ const server = new ParseServer({
|
|
|
231
231
|
appId: 'myAppId',
|
|
232
232
|
masterKey: 'myMasterKey', // Keep this key secret!
|
|
233
233
|
fileKey: 'optionalFileKey',
|
|
234
|
-
serverURL: 'http://localhost:1337/parse' // Don't forget to change to https if needed
|
|
234
|
+
serverURL: 'http://localhost:1337/parse', // Don't forget to change to https if needed
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
// Start server
|
|
@@ -240,7 +240,7 @@ await server.start();
|
|
|
240
240
|
// Serve the Parse API on the /parse URL prefix
|
|
241
241
|
app.use('/parse', server.app);
|
|
242
242
|
|
|
243
|
-
app.listen(1337, function() {
|
|
243
|
+
app.listen(1337, function () {
|
|
244
244
|
console.log('parse-server-example running on port 1337.');
|
|
245
245
|
});
|
|
246
246
|
```
|
|
@@ -262,7 +262,7 @@ The response looks like this:
|
|
|
262
262
|
### Status Values
|
|
263
263
|
|
|
264
264
|
| Value | Description |
|
|
265
|
-
|
|
265
|
+
| ------------- | --------------------------------------------------------------------------- |
|
|
266
266
|
| `initialized` | The server has been created but the `start` method has not been called yet. |
|
|
267
267
|
| `starting` | The server is starting up. |
|
|
268
268
|
| `ok` | The server started and is running. |
|
|
@@ -276,27 +276,27 @@ For the full list of available options, run `parse-server --help` or take a look
|
|
|
276
276
|
|
|
277
277
|
## Basic Options
|
|
278
278
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
279
|
+
- `appId` **(required)** - The application id to host with this server instance. You can use any arbitrary string. For migrated apps, this should match your hosted Parse app.
|
|
280
|
+
- `masterKey` **(required)** - The master key to use for overriding ACL security. You can use any arbitrary string. Keep it secret! For migrated apps, this should match your hosted Parse app.
|
|
281
|
+
- `databaseURI` **(required)** - The connection string for your database, i.e. `mongodb://user:pass@host.com/dbname`. Be sure to [URL encode your password](https://app.zencoder.com/docs/guides/getting-started/special-characters-in-usernames-and-passwords) if your password has special characters.
|
|
282
|
+
- `port` - The default port is 1337, specify this parameter to use a different port.
|
|
283
|
+
- `serverURL` - URL to your Parse Server (don't forget to specify http:// or https://). This URL will be used when making requests to Parse Server from Cloud Code.
|
|
284
|
+
- `cloud` - The absolute path to your cloud code `main.js` file.
|
|
285
|
+
- `push` - Configuration options for APNS and FCM push. See the [Push Notifications quick start](https://docs.parseplatform.org/parse-server/guide/#push-notifications-quick-start).
|
|
286
286
|
|
|
287
287
|
## Client Key Options
|
|
288
288
|
|
|
289
289
|
The client keys used with Parse are no longer necessary with Parse Server. If you wish to still require them, perhaps to be able to refuse access to older clients, you can set the keys at initialization time. Setting any of these keys will require all requests to provide one of the configured keys.
|
|
290
290
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
291
|
+
- `clientKey`
|
|
292
|
+
- `javascriptKey`
|
|
293
|
+
- `restAPIKey`
|
|
294
|
+
- `dotNetKey`
|
|
295
295
|
|
|
296
296
|
## Access Scopes
|
|
297
297
|
|
|
298
298
|
| Scope | Internal data | Read-only data <sub>(1)</sub> | Custom data | Restricted by CLP, ACL | Key |
|
|
299
|
-
|
|
299
|
+
| -------------- | ------------- | ----------------------------- | ----------- | ---------------------- | ------------------- |
|
|
300
300
|
| Internal | r/w | r/w | r/w | no | `maintenanceKey` |
|
|
301
301
|
| Master | -/- | r/- | r/w | no | `masterKey` |
|
|
302
302
|
| ReadOnlyMaster | -/- | r/- | r/- | no | `readOnlyMasterKey` |
|
|
@@ -323,16 +323,18 @@ const server = ParseServer({
|
|
|
323
323
|
module: 'example-mail-adapter',
|
|
324
324
|
options: {
|
|
325
325
|
// Additional adapter options
|
|
326
|
-
...mailAdapterOptions
|
|
327
|
-
}
|
|
326
|
+
...mailAdapterOptions,
|
|
327
|
+
},
|
|
328
328
|
},
|
|
329
329
|
});
|
|
330
330
|
```
|
|
331
331
|
|
|
332
332
|
Offical email adapters maintained by Parse Platform:
|
|
333
|
+
|
|
333
334
|
- [parse-server-api-mail-adapter](https://github.com/parse-community/parse-server-api-mail-adapter) (localization, templates, universally supports any email provider)
|
|
334
335
|
|
|
335
336
|
Email adapters contributed by the community:
|
|
337
|
+
|
|
336
338
|
- [parse-smtp-template](https://www.npmjs.com/package/parse-smtp-template) (localization, templates)
|
|
337
339
|
- [parse-server-postmark-adapter](https://www.npmjs.com/package/parse-server-postmark-adapter)
|
|
338
340
|
- [parse-server-sendgrid-adapter](https://www.npmjs.com/package/parse-server-sendgrid-adapter)
|
|
@@ -410,7 +412,7 @@ The `handler` receives the `request` and returns a `custom_page.html` webpage fr
|
|
|
410
412
|
The following paths are already used by Parse Server's built-in features and are therefore not available for custom routes. Custom routes with an identical combination of `path` and `method` are ignored.
|
|
411
413
|
|
|
412
414
|
| Path | HTTP Method | Feature |
|
|
413
|
-
|
|
415
|
+
| --------------------------- | ----------- | ------------------ |
|
|
414
416
|
| `verify_email` | `GET` | email verification |
|
|
415
417
|
| `resend_verification_email` | `POST` | email verification |
|
|
416
418
|
| `choose_password` | `GET` | password reset |
|
|
@@ -420,7 +422,7 @@ The following paths are already used by Parse Server's built-in features and are
|
|
|
420
422
|
### Parameters
|
|
421
423
|
|
|
422
424
|
| Parameter | Optional | Type | Default value | Example values | Environment variable | Description |
|
|
423
|
-
|
|
425
|
+
| ---------------------------- | -------- | --------------- | ------------- | --------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
424
426
|
| `pages` | yes | `Object` | `undefined` | - | `PARSE_SERVER_PAGES` | The options for pages such as password reset and email verification. |
|
|
425
427
|
| `pages.enableRouter` | yes | `Boolean` | `false` | - | `PARSE_SERVER_PAGES_ENABLE_ROUTER` | Is `true` if the pages router should be enabled; this is required for any of the pages options to take effect. |
|
|
426
428
|
| `pages.customRoutes` | yes | `Array` | `[]` | - | `PARSE_SERVER_PAGES_CUSTOM_ROUTES` | The custom routes. The routes are added in the order they are defined here, which has to be considered since requests traverse routes in an ordered manner. Custom routes are traversed after build-in routes such as password reset and email verification. |
|
|
@@ -437,16 +439,16 @@ const server = ParseServer({
|
|
|
437
439
|
...otherOptions,
|
|
438
440
|
|
|
439
441
|
customPages: {
|
|
440
|
-
passwordResetSuccess:
|
|
441
|
-
verifyEmailSuccess:
|
|
442
|
-
parseFrameURL:
|
|
443
|
-
linkSendSuccess:
|
|
444
|
-
linkSendFail:
|
|
445
|
-
invalidLink:
|
|
446
|
-
invalidVerificationLink:
|
|
447
|
-
choosePassword:
|
|
448
|
-
}
|
|
449
|
-
})
|
|
442
|
+
passwordResetSuccess: 'http://yourapp.com/passwordResetSuccess',
|
|
443
|
+
verifyEmailSuccess: 'http://yourapp.com/verifyEmailSuccess',
|
|
444
|
+
parseFrameURL: 'http://yourapp.com/parseFrameURL',
|
|
445
|
+
linkSendSuccess: 'http://yourapp.com/linkSendSuccess',
|
|
446
|
+
linkSendFail: 'http://yourapp.com/linkSendFail',
|
|
447
|
+
invalidLink: 'http://yourapp.com/invalidLink',
|
|
448
|
+
invalidVerificationLink: 'http://yourapp.com/invalidVerificationLink',
|
|
449
|
+
choosePassword: 'http://yourapp.com/choosePassword',
|
|
450
|
+
},
|
|
451
|
+
});
|
|
450
452
|
```
|
|
451
453
|
|
|
452
454
|
## Using Environment Variables
|
|
@@ -482,10 +484,10 @@ You can also find more adapters maintained by the community by searching on [npm
|
|
|
482
484
|
|
|
483
485
|
Parse Server allows developers to choose from several options when hosting files:
|
|
484
486
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
487
|
+
- `GridFSBucketAdapter` - which is backed by MongoDB
|
|
488
|
+
- `S3Adapter` - which is backed by [Amazon S3](https://aws.amazon.com/s3/)
|
|
489
|
+
- `GCSAdapter` - which is backed by [Google Cloud Storage](https://cloud.google.com/storage/)
|
|
490
|
+
- `FSAdapter` - local file storage
|
|
489
491
|
|
|
490
492
|
`GridFSBucketAdapter` is used by default and requires no setup, but if you're interested in using Amazon S3, Google Cloud Storage, or local file storage, additional configuration information is available in the [Parse Server guide](http://docs.parseplatform.org/parse-server/guide/#configuring-file-adapters).
|
|
491
493
|
|
|
@@ -515,7 +517,7 @@ let api = new ParseServer({
|
|
|
515
517
|
### Parameters <!-- omit in toc -->
|
|
516
518
|
|
|
517
519
|
| Parameter | Optional | Type | Default value | Example values | Environment variable | Description |
|
|
518
|
-
|
|
520
|
+
| -------------------------- | -------- | --------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
519
521
|
| `idempotencyOptions` | yes | `Object` | `undefined` | | PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_OPTIONS | Setting this enables idempotency enforcement for the specified paths. |
|
|
520
522
|
| `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` specify 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/`. |
|
|
521
523
|
| `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`. |
|
|
@@ -559,11 +561,13 @@ const api = new ParseServer({
|
|
|
559
561
|
```
|
|
560
562
|
|
|
561
563
|
Localization is achieved by matching a request-supplied `locale` parameter with localized page content. The locale can be supplied in either the request query, body or header with the following keys:
|
|
564
|
+
|
|
562
565
|
- query: `locale`
|
|
563
566
|
- body: `locale`
|
|
564
567
|
- header: `x-parse-page-param-locale`
|
|
565
568
|
|
|
566
569
|
For example, a password reset link with the locale parameter in the query could look like this:
|
|
570
|
+
|
|
567
571
|
```
|
|
568
572
|
http://example.com/parse/apps/[appId]/request_password_reset?token=[token]&username=[username]&locale=de-AT
|
|
569
573
|
```
|
|
@@ -579,6 +583,7 @@ Pages can be localized in two ways:
|
|
|
579
583
|
Pages are localized by using the corresponding file in the directory structure where the files are placed in subdirectories named after the locale or language. The file in the base directory is the default file.
|
|
580
584
|
|
|
581
585
|
**Example Directory Structure:**
|
|
586
|
+
|
|
582
587
|
```js
|
|
583
588
|
root/
|
|
584
589
|
├── public/ // pages base path
|
|
@@ -590,11 +595,13 @@ root/
|
|
|
590
595
|
```
|
|
591
596
|
|
|
592
597
|
Files are matched with the locale in the following order:
|
|
598
|
+
|
|
593
599
|
1. Locale match, e.g. locale `de-AT` matches file in folder `de-AT`.
|
|
594
600
|
1. Language match, e.g. locale `de-CH` matches file in folder `de`.
|
|
595
601
|
1. Default; file in base folder is returned.
|
|
596
602
|
|
|
597
603
|
**Configuration Example:**
|
|
604
|
+
|
|
598
605
|
```js
|
|
599
606
|
const api = new ParseServer({
|
|
600
607
|
...otherOptions,
|
|
@@ -610,9 +617,11 @@ const api = new ParseServer({
|
|
|
610
617
|
```
|
|
611
618
|
|
|
612
619
|
Pros:
|
|
620
|
+
|
|
613
621
|
- All files are complete in their content and can be easily opened and previewed by viewing the file in a browser.
|
|
614
622
|
|
|
615
623
|
Cons:
|
|
624
|
+
|
|
616
625
|
- In most cases, a localized page differs only slightly from the default page, which could cause a lot of duplicate code that is difficult to maintain.
|
|
617
626
|
|
|
618
627
|
#### Localization with JSON Resource
|
|
@@ -620,6 +629,7 @@ Cons:
|
|
|
620
629
|
Pages are localized by adding placeholders in the HTML files and providing a JSON resource that contains the translations to fill into the placeholders.
|
|
621
630
|
|
|
622
631
|
**Example Directory Structure:**
|
|
632
|
+
|
|
623
633
|
```js
|
|
624
634
|
root/
|
|
625
635
|
├── public/ // pages base path
|
|
@@ -631,6 +641,7 @@ root/
|
|
|
631
641
|
The JSON resource file loosely follows the [i18next](https://github.com/i18next/i18next) syntax, which is a syntax that is often supported by translation platforms, making it easy to manage translations, exporting them for use in Parse Server, and even to automate this workflow.
|
|
632
642
|
|
|
633
643
|
**Example JSON Content:**
|
|
644
|
+
|
|
634
645
|
```json
|
|
635
646
|
{
|
|
636
647
|
"en": { // resource for language `en` (English)
|
|
@@ -652,6 +663,7 @@ The JSON resource file loosely follows the [i18next](https://github.com/i18next/
|
|
|
652
663
|
```
|
|
653
664
|
|
|
654
665
|
**Configuration Example:**
|
|
666
|
+
|
|
655
667
|
```js
|
|
656
668
|
const api = new ParseServer({
|
|
657
669
|
...otherOptions,
|
|
@@ -666,9 +678,11 @@ const api = new ParseServer({
|
|
|
666
678
|
```
|
|
667
679
|
|
|
668
680
|
Pros:
|
|
681
|
+
|
|
669
682
|
- There is only one HTML file to maintain that contains the placeholders that are filled with the translations according to the locale.
|
|
670
683
|
|
|
671
684
|
Cons:
|
|
685
|
+
|
|
672
686
|
- Files cannot be easily previewed by viewing the file in a browser because the content contains only placeholders and even HTML or CSS changes may be dynamically applied, e.g. when a localization requires a Right-To-Left layout direction.
|
|
673
687
|
- Style and other fundamental layout changes may be more difficult to apply.
|
|
674
688
|
|
|
@@ -677,6 +691,7 @@ Cons:
|
|
|
677
691
|
In addition to feature related default parameters such as `appId` and the translations provided via JSON resource, it is possible to define custom dynamic placeholders as part of the router configuration. This works independently of localization and, also if `enableLocalization` is disabled.
|
|
678
692
|
|
|
679
693
|
**Configuration Example:**
|
|
694
|
+
|
|
680
695
|
```js
|
|
681
696
|
const api = new ParseServer({
|
|
682
697
|
...otherOptions,
|
|
@@ -689,6 +704,7 @@ const api = new ParseServer({
|
|
|
689
704
|
}
|
|
690
705
|
}
|
|
691
706
|
```
|
|
707
|
+
|
|
692
708
|
The placeholders can also be provided as function or as async function, with the `locale` and other feature related parameters passed through, to allow for dynamic placeholder values:
|
|
693
709
|
|
|
694
710
|
```js
|
|
@@ -714,7 +730,7 @@ The following parameter and placeholder keys are reserved because they are used
|
|
|
714
730
|
#### Parameters
|
|
715
731
|
|
|
716
732
|
| Parameter | Optional | Type | Default value | Example values | Environment variable | Description |
|
|
717
|
-
|
|
733
|
+
| ----------------------------------------------- | -------- | ------------------------------------- | -------------------------------------- | ---------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
718
734
|
| `pages` | yes | `Object` | `undefined` | - | `PARSE_SERVER_PAGES` | The options for pages such as password reset and email verification. |
|
|
719
735
|
| `pages.enableRouter` | yes | `Boolean` | `false` | - | `PARSE_SERVER_PAGES_ENABLE_ROUTER` | Is `true` if the pages router should be enabled; this is required for any of the pages options to take effect. |
|
|
720
736
|
| `pages.enableLocalization` | yes | `Boolean` | `false` | - | `PARSE_SERVER_PAGES_ENABLE_LOCALIZATION` | Is true if pages should be localized; this has no effect on custom page redirects. |
|
|
@@ -741,18 +757,19 @@ The following parameter and placeholder keys are reserved because they are used
|
|
|
741
757
|
## Logging
|
|
742
758
|
|
|
743
759
|
Parse Server will, by default, log:
|
|
744
|
-
|
|
745
|
-
|
|
760
|
+
|
|
761
|
+
- to the console
|
|
762
|
+
- daily rotating files as new line delimited JSON
|
|
746
763
|
|
|
747
764
|
Logs are also viewable in Parse Dashboard.
|
|
748
765
|
|
|
749
|
-
**Want to log each request and response?** Set the `VERBOSE` environment variable when starting `parse-server`. Usage :-
|
|
766
|
+
**Want to log each request and response?** Set the `VERBOSE` environment variable when starting `parse-server`. Usage :- `VERBOSE='1' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY`
|
|
750
767
|
|
|
751
|
-
**Want logs to be placed in a different folder?** Pass the `PARSE_SERVER_LOGS_FOLDER` environment variable when starting `parse-server`. Usage :-
|
|
768
|
+
**Want logs to be placed in a different folder?** Pass the `PARSE_SERVER_LOGS_FOLDER` environment variable when starting `parse-server`. Usage :- `PARSE_SERVER_LOGS_FOLDER='<path-to-logs-folder>' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY`
|
|
752
769
|
|
|
753
|
-
**Want to log specific levels?** Pass the `logLevel` parameter when starting `parse-server`. Usage :-
|
|
770
|
+
**Want to log specific levels?** Pass the `logLevel` parameter when starting `parse-server`. Usage :- `parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --logLevel LOG_LEVEL`
|
|
754
771
|
|
|
755
|
-
**Want new line delimited JSON error logs (for consumption by CloudWatch, Google Cloud Logging, etc)?** Pass the `JSON_LOGS` environment variable when starting `parse-server`. Usage :-
|
|
772
|
+
**Want new line delimited JSON error logs (for consumption by CloudWatch, Google Cloud Logging, etc)?** Pass the `JSON_LOGS` environment variable when starting `parse-server`. Usage :- `JSON_LOGS='1' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY`
|
|
756
773
|
|
|
757
774
|
# Deprecations
|
|
758
775
|
|
|
@@ -782,7 +799,7 @@ $ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongo
|
|
|
782
799
|
|
|
783
800
|
After starting the server, you can visit http://localhost:1337/playground in your browser to start playing with your GraphQL API.
|
|
784
801
|
|
|
785
|
-
|
|
802
|
+
**_Note:_** Do **_NOT_** use --mountPlayground option in production. [Parse Dashboard](https://github.com/parse-community/parse-dashboard) has a built-in GraphQL Playground and it is the recommended option for production apps.
|
|
786
803
|
|
|
787
804
|
### Using Docker
|
|
788
805
|
|
|
@@ -801,11 +818,11 @@ $ docker run --name my-mongo -d mongo
|
|
|
801
818
|
$ docker run --name my-parse-server --link my-mongo:mongo -v config-vol:/parse-server/config -p 1337:1337 -d parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongo/test --publicServerURL http://localhost:1337/parse --mountGraphQL --mountPlayground
|
|
802
819
|
```
|
|
803
820
|
|
|
804
|
-
|
|
821
|
+
**_Note:_** _If you want to use [Cloud Code](https://docs.parseplatform.org/cloudcode/guide/), add `-v cloud-code-vol:/parse-server/cloud --cloud /parse-server/cloud/main.js` to the command above. Make sure `main.js` is in the `cloud-code-vol` directory before starting Parse Server._
|
|
805
822
|
|
|
806
823
|
After starting the server, you can visit http://localhost:1337/playground in your browser to start playing with your GraphQL API.
|
|
807
824
|
|
|
808
|
-
|
|
825
|
+
**_Note:_** Do **_NOT_** use --mountPlayground option in production. [Parse Dashboard](https://github.com/parse-community/parse-dashboard) has a built-in GraphQL Playground and it is the recommended option for production apps.
|
|
809
826
|
|
|
810
827
|
### Using Express.js
|
|
811
828
|
|
|
@@ -830,23 +847,20 @@ const parseServer = new ParseServer({
|
|
|
830
847
|
appId: 'APPLICATION_ID',
|
|
831
848
|
masterKey: 'MASTER_KEY',
|
|
832
849
|
serverURL: 'http://localhost:1337/parse',
|
|
833
|
-
publicServerURL: 'http://localhost:1337/parse'
|
|
850
|
+
publicServerURL: 'http://localhost:1337/parse',
|
|
834
851
|
});
|
|
835
852
|
|
|
836
|
-
const parseGraphQLServer = new ParseGraphQLServer(
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
playgroundPath: '/playground'
|
|
841
|
-
}
|
|
842
|
-
);
|
|
853
|
+
const parseGraphQLServer = new ParseGraphQLServer(parseServer, {
|
|
854
|
+
graphQLPath: '/graphql',
|
|
855
|
+
playgroundPath: '/playground',
|
|
856
|
+
});
|
|
843
857
|
|
|
844
858
|
app.use('/parse', parseServer.app); // (Optional) Mounts the REST API
|
|
845
859
|
parseGraphQLServer.applyGraphQL(app); // Mounts the GraphQL API
|
|
846
860
|
parseGraphQLServer.applyPlayground(app); // (Optional) Mounts the GraphQL Playground - do NOT use in Production
|
|
847
861
|
|
|
848
862
|
await parseServer.start();
|
|
849
|
-
app.listen(1337, function() {
|
|
863
|
+
app.listen(1337, function () {
|
|
850
864
|
console.log('REST API running on http://localhost:1337/parse');
|
|
851
865
|
console.log('GraphQL API running on http://localhost:1337/graphql');
|
|
852
866
|
console.log('GraphQL Playground running on http://localhost:1337/playground');
|
|
@@ -862,7 +876,7 @@ $ node index.js
|
|
|
862
876
|
|
|
863
877
|
After starting the app, you can visit http://localhost:1337/playground in your browser to start playing with your GraphQL API.
|
|
864
878
|
|
|
865
|
-
|
|
879
|
+
**_Note:_** Do **_NOT_** mount the GraphQL Playground in production. [Parse Dashboard](https://github.com/parse-community/parse-dashboard) has a built-in GraphQL Playground and it is the recommended option for production apps.
|
|
866
880
|
|
|
867
881
|
## Checking the API health
|
|
868
882
|
|
|
@@ -957,13 +971,7 @@ Run the following to create your first object:
|
|
|
957
971
|
|
|
958
972
|
```graphql
|
|
959
973
|
mutation CreateGameScore {
|
|
960
|
-
createGameScore(
|
|
961
|
-
fields: {
|
|
962
|
-
playerName: "Sean Plott"
|
|
963
|
-
score: 1337
|
|
964
|
-
cheatMode: false
|
|
965
|
-
}
|
|
966
|
-
) {
|
|
974
|
+
createGameScore(fields: { playerName: "Sean Plott", score: 1337, cheatMode: false }) {
|
|
967
975
|
id
|
|
968
976
|
updatedAt
|
|
969
977
|
createdAt
|
|
@@ -1142,4 +1150,5 @@ Support us with a monthly donation and help us continue our activities. [Become
|
|
|
1142
1150
|
[log_release]: https://github.com/parse-community/parse-server/blob/release/changelogs/CHANGELOG_release.md
|
|
1143
1151
|
[log_beta]: https://github.com/parse-community/parse-server/blob/beta/changelogs/CHANGELOG_beta.md
|
|
1144
1152
|
[log_alpha]: https://github.com/parse-community/parse-server/blob/alpha/changelogs/CHANGELOG_alpha.md
|
|
1153
|
+
|
|
1145
1154
|
[server-options] http://parseplatform.org/parse-server/api/release/ParseServerOptions.html
|
|
@@ -12,7 +12,7 @@ exports.default = exports.PushAdapter = void 0;
|
|
|
12
12
|
// * getValidPushTypes()
|
|
13
13
|
// * send(devices, installations, pushStatus)
|
|
14
14
|
//
|
|
15
|
-
// Default is ParsePushAdapter, which uses
|
|
15
|
+
// Default is ParsePushAdapter, which uses FCM for
|
|
16
16
|
// android push and APNS for ios push.
|
|
17
17
|
/**
|
|
18
18
|
* @interface
|
|
@@ -37,4 +37,4 @@ class PushAdapter {
|
|
|
37
37
|
}
|
|
38
38
|
exports.PushAdapter = PushAdapter;
|
|
39
39
|
var _default = exports.default = PushAdapter;
|
|
40
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQdXNoQWRhcHRlciIsInNlbmQiLCJib2R5IiwiaW5zdGFsbGF0aW9ucyIsInB1c2hTdGF0dXMiLCJnZXRWYWxpZFB1c2hUeXBlcyIsImV4cG9ydHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvUHVzaC9QdXNoQWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFycyAqL1xuLy8gQGZsb3dcbi8vIFB1c2ggQWRhcHRlclxuLy9cbi8vIEFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBwdXNoIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20uXG4vL1xuLy8gQWRhcHRlciBjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxuLy8gKiBnZXRWYWxpZFB1c2hUeXBlcygpXG4vLyAqIHNlbmQoZGV2aWNlcywgaW5zdGFsbGF0aW9ucywgcHVzaFN0YXR1cylcbi8vXG4vLyBEZWZhdWx0IGlzIFBhcnNlUHVzaEFkYXB0ZXIsIHdoaWNoIHVzZXMgRkNNIGZvclxuLy8gYW5kcm9pZCBwdXNoIGFuZCBBUE5TIGZvciBpb3MgcHVzaC5cblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOkFkYXB0ZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXNoQWRhcHRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYm9keVxuICAgKiBAcGFyYW0ge1BhcnNlLkluc3RhbGxhdGlvbltdfSBpbnN0YWxsYXRpb25zXG4gICAqIEBwYXJhbSB7YW55fSBwdXNoU3RhdHVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc2VuZChib2R5OiBhbnksIGluc3RhbGxhdGlvbnM6IGFueVtdLCBwdXNoU3RhdHVzOiBhbnkpOiA/UHJvbWlzZTwqPiB7fVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdmFsaWQgcHVzaCB0eXBlcy5cbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiB2YWxpZCBwdXNoIHR5cGVzXG4gICAqL1xuICBnZXRWYWxpZFB1c2hUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1c2hBZGFwdGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUEsV0FBVyxDQUFDO0VBQ3ZCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxJQUFJQSxDQUFDQyxJQUFTLEVBQUVDLGFBQW9CLEVBQUVDLFVBQWUsRUFBZSxDQUFDOztFQUVyRTtBQUNGO0FBQ0E7QUFDQTtFQUNFQyxpQkFBaUJBLENBQUEsRUFBYTtJQUM1QixPQUFPLEVBQUU7RUFDWDtBQUNGO0FBQUNDLE9BQUEsQ0FBQU4sV0FBQSxHQUFBQSxXQUFBO0FBQUEsSUFBQU8sUUFBQSxHQUFBRCxPQUFBLENBQUFFLE9BQUEsR0FFY1IsV0FBVyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -17,11 +17,5 @@
|
|
|
17
17
|
*
|
|
18
18
|
* If there are no deprecations, this must return an empty array.
|
|
19
19
|
*/
|
|
20
|
-
module.exports = [
|
|
21
|
-
|
|
22
|
-
changeNewDefault: 'false'
|
|
23
|
-
}, {
|
|
24
|
-
optionKey: 'databaseOptions.allowPublicExplain',
|
|
25
|
-
changeNewDefault: 'false'
|
|
26
|
-
}];
|
|
27
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwib3B0aW9uS2V5IiwiY2hhbmdlTmV3RGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EZXByZWNhdG9yL0RlcHJlY2F0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBkZXByZWNhdGlvbnMuXG4gKlxuICogQWRkIGRlcHJlY2F0aW9ucyB0byB0aGUgYXJyYXkgdXNpbmcgdGhlIGZvbGxvd2luZyBrZXlzOlxuICogLSBgb3B0aW9uS2V5YCB7U3RyaW5nfTogVGhlIG9wdGlvbiBrZXkgaW5jbC4gaXRzIHBhdGgsIGUuZy4gYHNlY3VyaXR5LmVuYWJsZUNoZWNrYC5cbiAqIC0gYGVudktleWAge1N0cmluZ306IFRoZSBlbnZpcm9ubWVudCBrZXksIGUuZy4gYFBBUlNFX1NFUlZFUl9TRUNVUklUWWAuXG4gKiAtIGBjaGFuZ2VOZXdLZXlgIHtTdHJpbmd9OiBTZXQgdGhlIG5ldyBrZXkgbmFtZSBpZiB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSByZXBsYWNlZCxcbiAqIG9yIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGN1cnJlbnQga2V5IHdpbGwgYmUgcmVtb3ZlZCB3aXRob3V0IHJlcGxhY2VtZW50LlxuICogLSBgY2hhbmdlTmV3RGVmYXVsdGAge1N0cmluZ306IFNldCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSdzIGRlZmF1bHQgdmFsdWVcbiAqIHdpbGwgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gKiAtIGBzb2x1dGlvbmA6IFRoZSBpbnN0cnVjdGlvbiB0byByZXNvbHZlIHRoaXMgZGVwcmVjYXRpb24gd2FybmluZy4gT3B0aW9uYWwuIFRoaXNcbiAqIGluc3RydWN0aW9uIG11c3Qgbm90IGluY2x1ZGUgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hpY2ggaXMgYXV0by1nZW5lcmF0ZWQuXG4gKiBJdCBzaG91bGQgb25seSBjb250YWluIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gcmVnYXJkaW5nIHRoZSBkZXByZWNhdGlvbiBpZlxuICogbmVjZXNzYXJ5LlxuICpcbiAqIElmIHRoZXJlIGFyZSBubyBkZXByZWNhdGlvbnMsIHRoaXMgbXVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gW1xuICB7IG9wdGlvbktleTogJ2VuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzJywgY2hhbmdlTmV3RGVmYXVsdDogJ2ZhbHNlJyB9LFxuICB7IG9wdGlvbktleTogJ2RhdGFiYXNlT3B0aW9ucy5hbGxvd1B1YmxpY0V4cGxhaW4nLCBjaGFuZ2VOZXdEZWZhdWx0OiAnZmFsc2UnIH0sXG5dO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsTUFBTSxDQUFDQyxPQUFPLEdBQUcsQ0FDZjtFQUFFQyxTQUFTLEVBQUUsNEJBQTRCO0VBQUVDLGdCQUFnQixFQUFFO0FBQVEsQ0FBQyxFQUN0RTtFQUFFRCxTQUFTLEVBQUUsb0NBQW9DO0VBQUVDLGdCQUFnQixFQUFFO0FBQVEsQ0FBQyxDQUMvRSIsImlnbm9yZUxpc3QiOltdfQ==
|
|
20
|
+
module.exports = [];
|
|
21
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0RlcHJlY2F0b3IvRGVwcmVjYXRpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGRlcHJlY2F0aW9ucy5cbiAqXG4gKiBBZGQgZGVwcmVjYXRpb25zIHRvIHRoZSBhcnJheSB1c2luZyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKiAtIGBvcHRpb25LZXlgIHtTdHJpbmd9OiBUaGUgb3B0aW9uIGtleSBpbmNsLiBpdHMgcGF0aCwgZS5nLiBgc2VjdXJpdHkuZW5hYmxlQ2hlY2tgLlxuICogLSBgZW52S2V5YCB7U3RyaW5nfTogVGhlIGVudmlyb25tZW50IGtleSwgZS5nLiBgUEFSU0VfU0VSVkVSX1NFQ1VSSVRZYC5cbiAqIC0gYGNoYW5nZU5ld0tleWAge1N0cmluZ306IFNldCB0aGUgbmV3IGtleSBuYW1lIGlmIHRoZSBjdXJyZW50IGtleSB3aWxsIGJlIHJlcGxhY2VkLFxuICogb3Igc2V0IHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSByZW1vdmVkIHdpdGhvdXQgcmVwbGFjZW1lbnQuXG4gKiAtIGBjaGFuZ2VOZXdEZWZhdWx0YCB7U3RyaW5nfTogU2V0IHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5J3MgZGVmYXVsdCB2YWx1ZVxuICogd2lsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAqIC0gYHNvbHV0aW9uYDogVGhlIGluc3RydWN0aW9uIHRvIHJlc29sdmUgdGhpcyBkZXByZWNhdGlvbiB3YXJuaW5nLiBPcHRpb25hbC4gVGhpc1xuICogaW5zdHJ1Y3Rpb24gbXVzdCBub3QgaW5jbHVkZSB0aGUgZGVwcmVjYXRpb24gd2FybmluZyB3aGljaCBpcyBhdXRvLWdlbmVyYXRlZC5cbiAqIEl0IHNob3VsZCBvbmx5IGNvbnRhaW4gYWRkaXRpb25hbCBpbnN0cnVjdGlvbiByZWdhcmRpbmcgdGhlIGRlcHJlY2F0aW9uIGlmXG4gKiBuZWNlc3NhcnkuXG4gKlxuICogSWYgdGhlcmUgYXJlIG5vIGRlcHJlY2F0aW9ucywgdGhpcyBtdXN0IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBbXTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLEVBQUUiLCJpZ25vcmVMaXN0IjpbXX0=
|