From 8521f35df4a6e89d3a80921e8eb6adf58ab58c2f Mon Sep 17 00:00:00 2001 From: dblythy Date: Wed, 14 Sep 2022 14:58:04 +1000 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 11292a739ac6603a686c2516b4728c5c282c856a Author: Niko Diamadis Date: Sat Aug 13 13:48:06 2022 +0200 docs: fix outdated and incorrectly styled REST API code examples (#896) commit 26f98e3cbf44fed693d630f58dfbd472ee3f8004 Author: aclec <56152675+aclec@users.noreply.github.com> Date: Mon Aug 8 12:02:01 2022 +0200 fix: update doc with POST request for /loginAs (#897) commit 2ceb1f07f672ee186b64b508dd6d169e60397a6f Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Jul 22 20:10:05 2022 +0200 refactor: bump tzinfo from 1.2.7 to 1.2.10 (#887) commit 490b8879ab95d9c93c378c25693fc3aa9b611c39 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Jul 20 12:04:31 2022 +0200 refactor: bump terser from 5.3.7 to 5.14.2 (#886) commit 283de6240b81d869fab24faeac2a1d80948bc561 Author: Martin <64530191+MrMartinR@users.noreply.github.com> Date: Sat Jul 2 23:01:11 2022 +0100 docs: fix json (#885) commit bda85663a4395760113be0355c2693992a14ee33 Author: Martin <64530191+MrMartinR@users.noreply.github.com> Date: Sat Jul 2 11:07:56 2022 +0100 docs: format JSON code blocks as jsonc (#883) commit 86d16c03863e0ed6a3d3495a1b7c936eb0a9e52d Author: Jayson Ng Date: Wed Jun 1 08:05:07 2022 +0800 fix: unclear IoT apps terminology (#876) commit dd071853073471685f00f7991b98378dfa629881 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu May 19 12:43:49 2022 +0200 refactor: upgrade nokogiri from 1.13.4 to 1.13.6 (#873) commit 88bd1f3eb400eb3a54dd1450fdc82b6f93e6f2ae Author: Martin <64530191+MrMartinR@users.noreply.github.com> Date: Sat May 14 13:21:44 2022 +0100 docs: remove compatibility references; add deployment guide (#871) commit e663a09be664ed1ba6d3a1a840996423ac5b24c9 Author: Mosaab Emam Date: Wed Apr 27 13:17:44 2022 +0200 fix: add commas (#870) commit 23108ac233cedf53e4a2277971fa3f951c0442c9 Author: Ali Oğuzhan Yıldız Date: Thu Apr 21 03:13:49 2022 +0300 docs: add s3 adapter examples for Linode and Backblaze (#825) commit feb3dbb7b4f45f5d1c1b3c7b66e50778056be7a1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Apr 13 11:26:03 2022 +0200 Bump minimist from 1.2.5 to 1.2.6 (#869) commit d5f9bf93e226029d295badf21663cc1653c23aa8 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Apr 13 09:33:55 2022 +0200 Bump nokogiri from 1.13.3 to 1.13.4 (#868) commit 99026f4e05752b24244cfd7a26ddfbc5650b76a0 Author: Corey Date: Wed Apr 13 03:31:15 2022 -0400 Update keys and excludeKeys to use arrays (#820) commit c70c1b223b9aaf8c8c2ce2b65e0102d5ef913cd0 Author: GormanFletcher <78770467+GormanFletcher@users.noreply.github.com> Date: Mon Mar 21 21:28:22 2022 -0400 docs: document the new /loginAs REST endpoint (#832) commit 587b9307ed51f63ee5fdce24b51dd2316d3d096b Author: dblythy Date: Fri Mar 18 09:27:47 2022 +1100 docs: add requireAnyUserRoles and requireAllUserRoles on cloud validator (#816) commit 0ca8a557436946091d0765558cd8952ce320bd48 Author: dblythy Date: Fri Mar 18 09:23:46 2022 +1100 Update cloud-code-advanced.md (#847) commit 3190f66f04fb91f36f0524bef7b22c887034ba1c Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Feb 25 18:53:49 2022 -0800 Bump nokogiri from 1.12.5 to 1.13.3 (#864) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.12.5 to 1.13.3. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.12.5...v1.13.3) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit cd27bf5beed409bb605a26c5f66d95bf3994134f Author: Emmanuel Ihemegbulam <36275424+codeBlock-1984@users.noreply.github.com> Date: Wed Dec 8 19:46:56 2021 +0100 Fix typo in cloud-code.md (#860) commit 2d630e07af51637eaead6d322915afd9184ffa2e Author: Louis D'Hont Date: Thu Nov 25 20:57:45 2021 +0100 #857 Changed the GET method to POST on logging in (#858) commit 3b4d00b3070bcdf562a9b7eb21a43e9c762475f4 Author: Xiang Zhou Date: Tue Nov 2 17:42:15 2021 +0800 Fix the typo of platform. (#854) commit 5b3f61c85307afe32d776417e7d47fae5fad9cdf Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Oct 4 16:51:21 2021 +0200 Bump path-parse from 1.0.6 to 1.0.7 (#841) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit c520811c5a798ab257d904a6996fdd0f9f64d983 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Oct 4 16:50:51 2021 +0200 Bump nokogiri from 1.11.4 to 1.12.5 (#849) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.11.4 to 1.12.5. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.11.4...v1.12.5) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b4dc5360adbf3e52f44dedca206db6079b54ae82 Author: sanjampreet_singh <55652600+staticle@users.noreply.github.com> Date: Mon Oct 4 20:19:33 2021 +0530 Update relay.md (#852) commit d32b9836387db66a7ba235c746a284ebd31d8291 Author: Dev Prakash Sharma Date: Sat Oct 2 22:04:10 2021 +0530 📙 Updated apple auth adapter key (#851) commit fc540e24146c7051a74ba8b4158c95dc7aad6fd6 Author: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri Sep 3 09:59:33 2021 +0200 add best practice page (#845) commit a064a5c732fa75097c65ac80611063931e326f8b Author: Samuel Denis-D'Ortun Date: Sat Jul 31 18:31:10 2021 -0400 Fix quotes in code examples (#839) commit b2b654cdc82814a61da43ff82051a538917558c6 Author: FandryNoutah <57153456+FandryNoutah@users.noreply.github.com> Date: Mon Jul 26 23:42:36 2021 +0300 Need session activation from Parse (#830) * Need session activation from Parse After logging in with parseUser, it can be fine if you start session automatically and developers don't need to call PHP session_start() function, or define into the documentation the full use of the session, thanks. * Update users.md Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com> commit 710d728dd356356c02a4970bc9780986c4ef7b21 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Jul 15 21:39:32 2021 +0100 Bump addressable from 2.7.0 to 2.8.0 (#835) Bumps [addressable](https://github.com/sporkmonger/addressable) from 2.7.0 to 2.8.0. - [Release notes](https://github.com/sporkmonger/addressable/releases) - [Changelog](https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md) - [Commits](https://github.com/sporkmonger/addressable/compare/addressable-2.7.0...addressable-2.8.0) --- updated-dependencies: - dependency-name: addressable dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit ad266b7cecc9078329e60debbd15da881f39d57f Author: cyobrendan <43143380+cyobrendan@users.noreply.github.com> Date: Wed Jun 2 19:22:43 2021 -0600 Update database.md (#831) Small grammar update I noticed when combing through the docs. Thanks for all truly valuable contributions you guy make. commit 589b58d74af5bdec8b038646afe30b8788917bed Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed May 26 15:34:01 2021 -0700 Bump browserslist from 4.14.5 to 4.16.6 (#829) Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.14.5 to 4.16.6. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.14.5...4.16.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 4454557ac4be1a221ce756a4882e25af01951ab3 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue May 18 17:59:50 2021 +0100 Bump nokogiri from 1.11.1 to 1.11.4 (#828) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.11.1 to 1.11.4. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.11.1...v1.11.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit aea486ac88c79d44137828d1410b20232f763da6 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu May 6 23:19:38 2021 +0100 Bump lodash from 4.17.19 to 4.17.21 (#827) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 128c50d9d6571622180637472117f6aa7019b529 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu May 6 21:16:43 2021 +0100 Bump underscore from 1.11.0 to 1.12.1 (#826) Bumps [underscore](https://github.com/jashkenas/underscore) from 1.11.0 to 1.12.1. - [Release notes](https://github.com/jashkenas/underscore/releases) - [Commits](https://github.com/jashkenas/underscore/compare/1.11.0...1.12.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 4187fa86bd64c194c55d193896b0b3f1849e8d9c Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon May 3 16:00:39 2021 -0700 Bump rexml from 3.2.4 to 3.2.5 (#824) Bumps [rexml](https://github.com/ruby/rexml) from 3.2.4 to 3.2.5. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.4...v3.2.5) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit c500faf137fe3f3e64182a8afae6d2ed363e2bc0 Author: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Thu Apr 15 09:17:53 2021 +0200 Improve security section (#823) * refactored security section * Fixed absolute URLs commit f46829a57f22c296b902cd3bab5ae426ef0e6bb0 Author: Rikard Teodorsson <9367038+hej2010@users.noreply.github.com> Date: Wed Apr 7 18:54:14 2021 +0200 Removed MongoRocks from the parse-server guide (#822) * Removed MongoRocks from the guide * Removed link to MongoRocks commit 4d02e57cf94602684191b0545548519f7813488a Author: dblythy Date: Thu Apr 8 02:32:45 2021 +1000 Add afterFind Considerations (#821) * add afterFind considerations * Update cloud-code.md commit dcdfe4bb3ec4201e6406b67519182be9c7ac955a Author: Sam Jarman Date: Thu Feb 4 16:14:56 2021 +1300 Fix formatting on Deleting Files header (#815) Just needed a space commit 7dfb2f3b1662adcc37610af959623b30a295163a Author: Tom Fox <13188249+TomWFox@users.noreply.github.com> Date: Tue Jan 19 19:11:08 2021 +0000 Update index.md (#813) commit 0398724220c81be52b514118cc7c1aed25fae4be Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Jan 19 10:54:44 2021 -0800 Bump nokogiri from 1.10.10 to 1.11.1 (#812) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.10.10 to 1.11.1. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.10.10...v1.11.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit cec1686acefb7a0523873d47ef7534fbfde65251 Author: CapacitorSet Date: Sat Jan 16 21:50:22 2021 +0100 Fix enableLocalDataStore usage (#807) commit a1c91f3a769cfad9b032f61e781cee4e0e63bd65 Author: dblythy Date: Wed Jan 6 03:08:11 2021 +1100 Update cloud-code.md (#810) commit 32353649ddb793374106deb60e2ccb643905336f Author: Alysson Melo Date: Wed Dec 16 17:03:25 2020 -0300 Update deploying-heroku-mlab.md (#802) * Update deploying-heroku-mlab.md * Update deploying-heroku-mlab.md * Update deploying-heroku-mlab.md * Update deploying-heroku-mlab.md * Update deploying-heroku-mlab.md * Update deploying-heroku-mlab.md * Update deploying-heroku-mlab.md commit 5a5465e9f4f69223a1c35337b3fb9055f1a13735 Author: dblythy Date: Wed Dec 16 02:05:20 2020 +1100 Fix casing for afterLiveQueryEvent (#797) commit c257296f8f7b2a955f02a66e9036e16fd9729c86 Author: Manuel Date: Tue Dec 15 16:04:30 2020 +0100 added error code (#805) commit 95b5c193314dd6a521b3d24caa769bc62ed8cd1b Author: Tom Fox <13188249+TomWFox@users.noreply.github.com> Date: Tue Dec 15 15:00:26 2020 +0000 Remove info about restricted tokens (#787) * Update sessions.md * Update sessions.md * remove restricted property * Improve Parse for IoT term commit ae17f02c2e701868084972154811a933dee22914 Author: Alysson Melo Date: Tue Dec 8 16:54:21 2020 -0300 Delete compatibility.md (#800) * Delete compatibility.md Removing not relevant/outdated Parse.com session * Update parse-server.md commit d368bd12d1e750bf2abb636e7c75fd422b3fcadd Author: Manuel Date: Mon Dec 7 15:50:50 2020 +0100 Documentation for deleting files (improvement) (#791) * improved JS doc for deleting file * removed required reference to delete file * changed bullet point to headline commit 3191782a9d839ec78a2e5e77974e11927da12a4d Author: Manuel Date: Fri Dec 4 21:52:58 2020 +0100 corrected incorrect error code (#804) commit fa348c447ce5bb48a76c9d4f889ae3213a9eb82b Author: Alysson Melo Date: Fri Nov 27 11:27:40 2020 -0300 Update database.md (#799) * Update database.md -updated mLAB information * Update database.md * Update database.md commit 7a60da030c28ef2f8592ece88c55f7d6a84ed7c2 Author: Alysson Melo Date: Thu Nov 26 11:43:14 2020 -0300 Update getting-started.md (#798) * Update getting-started.md -Removing migration from hosted Parse information -Adding some information to better explain Parse Server to new users * Update getting-started.md commit 7f1a23a8bcf49e4e0fee43dda9a369d4922afb5b Author: dblythy Date: Fri Nov 20 05:19:09 2020 +1100 Remove trailing new line from copy text (#794) commit 52e01b1893a8853c6048855b3519e5063ba82a47 Author: Antonio Davi Macedo Coelho de Castro Date: Wed Nov 18 14:26:41 2020 -0800 Replace var to const (#795) commit 6e2a85a97f3505127118ba83b8d40388358d09da Author: Hakim Bawa <43802542+bawahakim@users.noreply.github.com> Date: Wed Nov 18 16:23:23 2020 -0500 Update objects.md (#793) * Update objects.md * Update objects.md commit 9efae05182a211a6f5ec385c1b2bce11f8ea5ac3 Author: dblythy Date: Wed Nov 18 09:51:02 2020 +1100 Copy to clupboard (#790) commit 055a1fed7945079c5b389df76fd4dbaabca84629 Author: dblythy Date: Wed Nov 18 00:22:34 2020 +1100 Documentation for deleting files (#789) * Documentation for deleting files Closes #726 * Update files.md * Update files.md commit b36fc116ae9f8f0ee4fd6f43cff41321d6593c16 Author: Gunnar Oledal Date: Thu Nov 12 22:22:43 2020 +0100 Clarifying documentation of custom authentication (#785) * Clarifying documentation of custom authentication. Documentation on custom authentication was extremely unclear. Tried to clarify a few aspects. That id is required in the authData object. Also what is client-side vs backend code. Very open to feedback and improvements! * Update users.md * Apply suggestions from code review Co-authored-by: Diamond Lewis Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> commit bd221b78d6b47fbef8f5423a8faaaeccea3a4dc0 Author: Diamond Lewis Date: Wed Nov 11 03:40:39 2020 -0600 Add ES6 Import to JS (#786) commit 9b8846b7870cbe1cb8d4c8be91769a34d00f4be4 Author: dblythy Date: Tue Nov 3 07:26:11 2020 +1100 Update cloud-code.md (#784) commit 4275a4c9abc40c4d0b40c95d74cd2b6840a89704 Author: dblythy Date: Tue Nov 3 04:17:20 2020 +1100 Cloud Validator Documentation (#782) * Cloud Validator * Update cloud-code.md * Apply nits from code review * Update _includes/cloudcode/cloud-code.md Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/cloudcode/cloud-code.md Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/cloudcode/cloud-code.md Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/cloudcode/cloud-code.md Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> commit bd64ec88f580efba162681d4b8fb093c7613780e Author: dblythy Date: Tue Nov 3 04:15:48 2020 +1100 afterLiveQueryEvent Triggers (#773) * afterLiveQueryEvent * Update cloud-code.md * Update cloud-code.md * Update cloud-code.md * Apply suggestions from code review * Context around database operations with LiveQuery * add parse server version Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> commit ca9e2f348271b89af0bf08f263de3bf7054abddd Author: Rhuan <283004+rhuanbarreto@users.noreply.github.com> Date: Mon Nov 2 18:13:33 2020 +0100 Add keycloak auth (#703) * Add keycloak referering to PR #6376 in parse-server * Update _includes/parse-server/third-party-auth.md Co-Authored-By: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/parse-server/third-party-auth.md Co-Authored-By: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/parse-server/third-party-auth.md Co-Authored-By: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/parse-server/third-party-auth.md Co-Authored-By: Tom Fox <13188249+TomWFox@users.noreply.github.com> * Update _includes/parse-server/third-party-auth.md Co-Authored-By: Tom Fox <13188249+TomWFox@users.noreply.github.com> Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> commit 37498c6d2462f3667a9eeae8297918da5f2c266f Author: Mark Nguyen <44610543+nghongphuong94@users.noreply.github.com> Date: Mon Nov 2 11:59:30 2020 +0700 Update relations.md (#783) - Fix typo. commit d136ecf468dbe4b2969db39b6069efa3af562dd9 Author: Corey Date: Mon Oct 26 12:56:56 2020 -0400 Update file adapter docs (#780) * Update file adapter docs * Add file adapter to postgres database docs * Fixed available versions * Add default file directory commit 180c5d8739071fa47f764c8882b9c0705d8fa422 Author: Diamond Lewis Date: Sat Oct 24 04:15:15 2020 -0500 Enable Live Reload (#779) * Enable Live Reload * typo commit 54a720401c4a7ff28db85c9101c42729b1bdf142 Author: Corey Date: Fri Oct 23 19:27:40 2020 -0400 Add GridStoreAdapter and FSAdapter Config (#778) commit 501344c90710e534b879a71b713ee1ff7006a2d9 Author: Paulo Reis Date: Thu Oct 22 23:00:28 2020 -0300 Remove fb account kit from docs (#777) commit 83a03950312c49b7c7725bc754c87f6967400c18 Author: Diamond Lewis Date: Wed Oct 21 17:09:09 2020 -0500 Replace response.success (#776) commit e0d56aa93f6cf132b35a32663a00e4950a1be8d8 Author: Diamond Lewis Date: Wed Oct 21 16:51:23 2020 -0500 chore: Dump Dependencies (#775) * gem dependencies * node dependencies * Update .gitignore * Add License commit 02030f72c2167bfac6f6e6fc206ec7af76412eed Author: dblythy Date: Wed Oct 21 09:08:53 2020 +1100 Replace response.success / response.error (#774) --- Gemfile.lock | 248 +- README.md | 1 + _includes/android/local-datastore.md | 10 + _includes/android/objects.md | 12 +- _includes/arduino/cloud-code.md | 4 +- _includes/arduino/objects.md | 13 +- _includes/cloudcode/cloud-code-advanced.md | 24 +- _includes/cloudcode/cloud-code.md | 207 +- _includes/common/data.md | 8 +- _includes/common/errors.md | 5 +- _includes/common/performance.md | 31 +- _includes/common/relations.md | 2 +- _includes/common/security.md | 24 +- _includes/common/sessions.md | 23 +- _includes/dotnet/objects.md | 12 +- _includes/embedded_c/cloud-code.md | 4 +- _includes/graphql/classes.md | 4 +- _includes/graphql/customisation.md | 24 +- _includes/graphql/files.md | 16 +- _includes/graphql/health-check.md | 4 +- _includes/graphql/objects.md | 20 +- _includes/graphql/queries.md | 40 +- _includes/graphql/relay.md | 2 +- _includes/graphql/users.md | 28 +- _includes/ios/files.md | 2 +- _includes/ios/objects.md | 12 +- _includes/js/analytics.md | 4 +- _includes/js/files.md | 33 +- _includes/js/geopoints.md | 8 +- _includes/js/getting-started.md | 8 +- _includes/js/objects.md | 120 +- _includes/js/promises.md | 6 +- _includes/js/push-notifications.md | 28 +- _includes/js/queries.md | 94 +- _includes/js/roles.md | 20 +- _includes/js/users.md | 65 +- _includes/parse-server/Files-Migration.md | 22 - _includes/parse-server/MongoRocks.md | 201 - _includes/parse-server/ParsePlatform.md | 37 - _includes/parse-server/best-practice.md | 23 + _includes/parse-server/compatibility.md | 258 - _includes/parse-server/database.md | 32 +- .../parse-server/deploying-aws-ubuntu.md | 187 + .../parse-server/deploying-heroku-mlab.md | 15 +- _includes/parse-server/deploying.md | 2 + _includes/parse-server/file-adapters.md | 278 +- _includes/parse-server/getting-started.md | 52 +- ...Preference.md => mongo-read-preference.md} | 0 .../parse-server/push-notifications-ios.md | 57 +- _includes/parse-server/push-notifications.md | 31 +- _includes/parse-server/third-party-auth.md | 106 +- _includes/parse-server/usage.md | 14 +- _includes/php/installation.md | 2 +- _includes/php/objects.md | 12 +- _includes/php/setup.md | 4 +- _includes/php/users.md | 2 +- _includes/rest/analytics.md | 74 +- _includes/rest/cloud-code.md | 41 +- _includes/rest/config.md | 19 +- _includes/rest/files.md | 82 +- _includes/rest/geopoints.md | 219 +- _includes/rest/hooks.md | 357 +- _includes/rest/objects.md | 472 +- _includes/rest/push-notifications.md | 703 +- _includes/rest/queries.md | 987 +- _includes/rest/quick-reference.md | 2 +- _includes/rest/roles.md | 288 +- _includes/rest/schemas.md | 176 +- _includes/rest/sessions.md | 197 +- _includes/rest/users.md | 426 +- _includes/unity/objects.md | 14 +- _layouts/default.html | 4 +- android-api.md | 2 +- assets/js/bundle.js | 13 +- assets/js/bundle.js.LICENSE.txt | 10 + index.md | 68 - package-lock.json | 8827 +++++++---------- package.json | 21 +- parse-server.md | 5 +- webpack.config.js | 4 +- 80 files changed, 7097 insertions(+), 8415 deletions(-) delete mode 100644 _includes/parse-server/Files-Migration.md delete mode 100644 _includes/parse-server/MongoRocks.md delete mode 100644 _includes/parse-server/ParsePlatform.md create mode 100644 _includes/parse-server/best-practice.md delete mode 100644 _includes/parse-server/compatibility.md create mode 100644 _includes/parse-server/deploying-aws-ubuntu.md rename _includes/parse-server/{MongoReadPreference.md => mongo-read-preference.md} (100%) create mode 100644 assets/js/bundle.js.LICENSE.txt diff --git a/Gemfile.lock b/Gemfile.lock index 356e19bc1..fc3300a73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,14 @@ GEM remote: https://rubygems.org/ specs: - activesupport (4.2.10) - i18n (~> 0.7) + activesupport (6.0.3.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) coffee-script (2.4.1) coffee-script-source execjs @@ -15,136 +16,136 @@ GEM colorator (1.1.0) commonmarker (0.17.13) ruby-enum (~> 0.5) - concurrent-ruby (1.1.3) - dnsruby (1.61.2) - addressable (~> 2.5) - em-websocket (0.5.1) + concurrent-ruby (1.1.7) + dnsruby (1.61.4) + simpleidn (~> 0.1) + em-websocket (0.5.2) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) - ethon (0.11.0) + ethon (0.12.0) ffi (>= 1.3.0) eventmachine (1.2.7) - eventmachine (1.2.7-x64-mingw32) execjs (2.7.0) - faraday (0.15.4) + faraday (1.1.0) multipart-post (>= 1.2, < 3) - ffi (1.9.25) - ffi (1.9.25-x64-mingw32) + ruby2_keywords + ffi (1.13.1) forwardable-extended (2.6.0) - gemoji (3.0.0) - github-pages (193) - activesupport (= 4.2.10) - github-pages-health-check (= 1.8.1) - jekyll (= 3.7.4) - jekyll-avatar (= 0.6.0) + gemoji (3.0.1) + github-pages (209) + github-pages-health-check (= 1.16.1) + jekyll (= 3.9.0) + jekyll-avatar (= 0.7.0) jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.5) + jekyll-commonmark-ghpages (= 0.1.6) jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.11.0) + jekyll-feed (= 0.15.1) jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.9.4) - jekyll-mentions (= 1.4.1) - jekyll-optional-front-matter (= 0.3.0) + jekyll-github-metadata (= 2.13.0) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.2.0) - jekyll-redirect-from (= 0.14.0) - jekyll-relative-links (= 0.5.3) - jekyll-remote-theme (= 0.3.1) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.2) jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.5.0) - jekyll-sitemap (= 1.2.0) - jekyll-swiss (= 0.4.0) + jekyll-seo-tag (= 2.6.1) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) jekyll-theme-architect (= 0.1.1) jekyll-theme-cayman (= 0.1.1) jekyll-theme-dinky (= 0.1.1) - jekyll-theme-hacker (= 0.1.1) + jekyll-theme-hacker (= 0.1.2) jekyll-theme-leap-day (= 0.1.1) jekyll-theme-merlot (= 0.1.1) jekyll-theme-midnight (= 0.1.1) jekyll-theme-minimal (= 0.1.1) jekyll-theme-modernist (= 0.1.1) - jekyll-theme-primer (= 0.5.3) + jekyll-theme-primer (= 0.5.4) jekyll-theme-slate (= 0.1.1) jekyll-theme-tactile (= 0.1.1) jekyll-theme-time-machine (= 0.1.1) - jekyll-titles-from-headings (= 0.5.1) - jemoji (= 0.10.1) - kramdown (= 1.17.0) - liquid (= 4.0.0) - listen (= 3.1.5) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.0) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.3) mercenary (~> 0.3) - minima (= 2.5.0) - nokogiri (>= 1.8.2, < 2.0) - rouge (= 2.2.1) + minima (= 2.5.1) + nokogiri (>= 1.10.4, < 2.0) + rouge (= 3.23.0) terminal-table (~> 1.4) - github-pages-health-check (1.8.1) + github-pages-health-check (1.16.1) addressable (~> 2.3) dnsruby (~> 1.60) octokit (~> 4.0) - public_suffix (~> 2.0) + public_suffix (~> 3.0) typhoeus (~> 1.3) - html-pipeline (2.9.1) + html-pipeline (2.14.0) activesupport (>= 2) nokogiri (>= 1.4) http_parser.rb (0.6.0) i18n (0.9.5) concurrent-ruby (~> 1.0) - jekyll (3.7.4) + jekyll (3.9.0) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) i18n (~> 0.7) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) - kramdown (~> 1.14) + kramdown (>= 1.17, < 3) liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) rouge (>= 1.7, < 4) safe_yaml (~> 1.0) - jekyll-avatar (0.6.0) - jekyll (~> 3.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) jekyll-coffeescript (1.1.1) coffee-script (~> 2.2) coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.2.0) + jekyll-commonmark (1.3.1) commonmarker (~> 0.14) - jekyll (>= 3.0, < 4.0) - jekyll-commonmark-ghpages (0.1.5) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.6) commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1) - rouge (~> 2) + jekyll-commonmark (~> 1.2) + rouge (>= 2.0, < 4.0) jekyll-default-layout (0.1.4) jekyll (~> 3.0) - jekyll-feed (0.11.0) - jekyll (~> 3.3) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) jekyll-gist (1.5.0) octokit (~> 4.2) - jekyll-github-metadata (2.9.4) - jekyll (~> 3.1) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) octokit (~> 4.0, != 4.4.0) - jekyll-mentions (1.4.1) + jekyll-mentions (1.6.0) html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.3.0) - jekyll (~> 3.0) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) jekyll-paginate (1.1.0) - jekyll-readme-index (0.2.0) - jekyll (~> 3.0) - jekyll-redirect-from (0.14.0) - jekyll (~> 3.3) - jekyll-relative-links (0.5.3) - jekyll (~> 3.3) - jekyll-remote-theme (0.3.1) - jekyll (~> 3.5) - rubyzip (>= 1.2.1, < 3.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.2) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) - jekyll-seo-tag (2.5.0) - jekyll (~> 3.3) - jekyll-sitemap (1.2.0) - jekyll (~> 3.3) - jekyll-swiss (0.4.0) + jekyll-seo-tag (2.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) jekyll-theme-architect (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) @@ -154,8 +155,8 @@ GEM jekyll-theme-dinky (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.1) - jekyll (~> 3.5) + jekyll-theme-hacker (0.1.2) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) jekyll-theme-leap-day (0.1.1) jekyll (~> 3.5) @@ -172,8 +173,8 @@ GEM jekyll-theme-modernist (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.3) - jekyll (~> 3.5) + jekyll-theme-primer (0.5.4) + jekyll (> 3.5, < 5.0) jekyll-github-metadata (~> 2.9) jekyll-seo-tag (~> 2.0) jekyll-theme-slate (0.1.1) @@ -185,66 +186,75 @@ GEM jekyll-theme-time-machine (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.1) - jekyll (~> 3.3) - jekyll-watch (2.1.2) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) listen (~> 3.0) - jemoji (0.10.1) + jemoji (0.12.0) gemoji (~> 3.0) html-pipeline (~> 2.2) - jekyll (~> 3.0) - kramdown (1.17.0) - liquid (4.0.0) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.3.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - mini_portile2 (2.4.0) - minima (2.5.0) - jekyll (~> 3.5) + mini_portile2 (2.8.0) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.11.3) - multipart-post (2.0.0) - nokogiri (1.10.8) - mini_portile2 (~> 2.4.0) - nokogiri (1.10.8-x64-mingw32) - mini_portile2 (~> 2.4.0) - octokit (4.13.0) + minitest (5.14.2) + multipart-post (2.1.1) + nokogiri (1.13.6) + mini_portile2 (~> 2.8.0) + racc (~> 1.4) + octokit (4.19.0) + faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (2.0.5) - rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) - rouge (2.2.1) - ruby-enum (0.7.2) + public_suffix (3.1.1) + racc (1.6.0) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.23.0) + ruby-enum (0.8.0) i18n - ruby_dep (1.5.0) - rubyzip (2.0.0) - safe_yaml (1.0.4) - sass (3.7.2) + ruby2_keywords (0.0.2) + rubyzip (2.3.0) + safe_yaml (1.0.5) + sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + simpleidn (0.1.1) + unf (~> 0.1.4) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thread_safe (0.3.6) - typhoeus (1.3.1) + typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.5) + tzinfo (1.2.10) thread_safe (~> 0.1) - unicode-display_width (1.4.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (1.7.0) + zeitwerk (2.4.0) PLATFORMS ruby - x64-mingw32 DEPENDENCIES github-pages @@ -252,4 +262,4 @@ DEPENDENCIES jekyll-redirect-from BUNDLED WITH - 1.17.1 + 1.17.2 diff --git a/README.md b/README.md index 57ce83b18..d3d90f592 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ npm run dev-win ``` Finally, open http://localhost:4000/ in your web browser. +File changes will be output to `_site` folder and the browser will auto refresh. ----- diff --git a/_includes/android/local-datastore.md b/_includes/android/local-datastore.md index 6cec37bd0..fe91a05d3 100644 --- a/_includes/android/local-datastore.md +++ b/_includes/android/local-datastore.md @@ -17,6 +17,16 @@ public class App extends Application { } ``` +If you use a `Parse.Configuration.Builder`, enable it there instead: + +```java +Parse.initialize(new Parse.Configuration.Builder(context) + .server(...) + .applicationId(...) + .enableLocalDataStore() + .build()); +``` + There are a couple of side effects of enabling the local datastore that you should be aware of. When enabled, there will only be one instance of any given `ParseObject`. For example, imagine you have an instance of the `"GameScore"` class with an `objectId` of `"xWMyZ4YEGZ"`, and then you issue a `ParseQuery` for all instances of `"GameScore"` with that `objectId`. The result will be the same instance of the object you already have in memory. Another side effect is that the current user and current installation will be stored in the local datastore, so you can persist unsaved changes to these objects between runs of your app using the methods below. diff --git a/_includes/android/objects.md b/_includes/android/objects.md index f8f5005f3..b101e9c07 100644 --- a/_includes/android/objects.md +++ b/_includes/android/objects.md @@ -28,9 +28,15 @@ gameScore.saveInBackground(); After this code runs, you will probably be wondering if anything really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this: -```javascript -objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, -createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `GameScore` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. diff --git a/_includes/arduino/cloud-code.md b/_includes/arduino/cloud-code.md index 5b6fed760..44d80fd5f 100644 --- a/_includes/arduino/cloud-code.md +++ b/_includes/arduino/cloud-code.md @@ -7,8 +7,8 @@ You write your Cloud Code in JavaScript using the Parse JavaScript SDK. We provi For example, you define a Cloud Function as below. ```javascript -Parse.Cloud.define("hello", function(request, response) { - response.success(request.body); +Parse.Cloud.define("hello", request => { + return request.body; }); ``` diff --git a/_includes/arduino/objects.md b/_includes/arduino/objects.md index 77d16fe9d..138ea34d5 100644 --- a/_includes/arduino/objects.md +++ b/_includes/arduino/objects.md @@ -35,8 +35,15 @@ response.close(); // Free the resource After this code runs, you will probably be wondering if anything really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this: -```javascript - objectId: "xWMyZ4YEGZ", temperature: 175.0, leverDown: true, createdAt: "2011-06-10T18:33:42Z", updatedAt: "2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `Temperature` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. @@ -106,7 +113,7 @@ create.setClassName("TestObject"); create.add("number", 42.0); create.add("foo", "bar"); create.addGeoPoint("location", 40.0, -30.0); -create.addJSONValue("dateField", "{ \"__type\": \"Date\", \"iso\": \"2011-08-21T18:02:52.249Z\" }"); create.addJSONValue("arrayField", "[ 30, \"string\" ]"); +create.addJSONValue("dateField", "{ \"__type\": \"Date\", \"iso\": \"2022-01-01T12:23:45.678Z\" }"); create.addJSONValue("arrayField", "[ 30, \"string\" ]"); create.addJSONValue("objectField", "{ \"number\": 30, \"string\": \"baz\" }"); create.addJSONValue("emptyField", "null"); create.send(); diff --git a/_includes/cloudcode/cloud-code-advanced.md b/_includes/cloudcode/cloud-code-advanced.md index 7a9f0bebb..2aefc128f 100644 --- a/_includes/cloudcode/cloud-code-advanced.md +++ b/_includes/cloudcode/cloud-code-advanced.md @@ -2,7 +2,7 @@ ## httpRequest -You can use your favorite npm module to make HTTP requests, such as [request](https://www.npmjs.com/package/request). Parse Server also supports `Parse.Cloud.httpRequest` for legacy reasons. It allows you to send HTTP requests to any HTTP Server. This function takes an options object to configure the call. +You can use your favorite npm module to make HTTP requests, such as [axios](https://www.npmjs.com/package/axios). Parse Server also supports `Parse.Cloud.httpRequest` for legacy reasons. It allows you to send HTTP requests to any HTTP Server. This function takes an options object to configure the call. A simple GET request would look like: @@ -206,7 +206,7 @@ end Here's an example of the JSON data that would be sent in the request to this webhook: -```json +```jsonc // Sent to webhook { "master": false, @@ -225,14 +225,14 @@ Here's an example of the JSON data that would be sent in the request to this web This response would indicate a success in the webhook: -```json +```jsonc // Returned from the webhook on success { "success": "Hello World!" } ``` This response would indicate an error in the webhook: -```json +```jsonc // Returned from the webhook on error { "error": "Error message >:(" } ``` @@ -275,7 +275,7 @@ end Here's an example of the JSON data that would be sent in the request to this webhook: -```json +```jsonc // Sent to webhook { "master": true, @@ -287,7 +287,7 @@ Here's an example of the JSON data that would be sent in the request to this web This response would indicate a success in the webhook: -```json +```jsonc // Returned from the webhook on success { "success": "User billed!" } ``` @@ -310,7 +310,7 @@ For triggers, the following parameters are sent to your webhook. To respond to a `beforeSave` request, send a JSON object with the key `error` or `success` set. This is the same as for Cloud functions, but there's an extra capability with `beforeSave` triggers. By returning an error, you will cancel the save request and the object will not be stored on Parse. You can also return a JSON object in this following format to override the values that will be saved for the object: -```json +```jsonc { "className": "AwesomeClass", "existingColumn": "sneakyChange", @@ -348,7 +348,7 @@ end Here's an example of the JSON data that would be sent in the request to this webhook: -```json +```jsonc // Sent to webhook { "master": false, @@ -419,7 +419,7 @@ end Here's an example of the JSON data that would be sent in the request to this webhook: -```json +```jsonc // Sent to webhook { "master": false, @@ -485,7 +485,7 @@ end Here's an example of the JSON data that would be sent in the request to this webhook: -```json +```jsonc // Sent to webhook { "master": false, @@ -509,7 +509,7 @@ Here's an example of the JSON data that would be sent in the request to this web This response would indicate a success in the webhook: -```json +```jsonc // Returned from the webhook on success { "success": true } ``` @@ -554,7 +554,7 @@ end Here's an example of the JSON data that would be sent in the request to this webhook: -```json +```jsonc // Sent to webhook { "master": false, diff --git a/_includes/cloudcode/cloud-code.md b/_includes/cloudcode/cloud-code.md index 211bdc716..abe4b96be 100644 --- a/_includes/cloudcode/cloud-code.md +++ b/_includes/cloudcode/cloud-code.md @@ -2,7 +2,7 @@ Let's look at a slightly more complex example where Cloud Code is useful. One reason to do computation in the cloud is so that you don't have to send a huge list of objects down to a device if you only want a little bit of information. For example, let's say you're writing an app that lets people review movies. A single `Review` object could look like: -```json +```jsonc { "movie": "The Matrix", "stars": 5, @@ -112,19 +112,151 @@ In general, two arguments will be passed into cloud functions: If the function is successful, the response in the client looks like: -```json +```jsonc { "result": 4.8 } ``` If there is an error, the response in the client looks like: -```json +```jsonc { "code": 141, "error": "movie lookup failed" } ``` +## Implementing cloud function validation + +*Available only on parse-server cloud code starting 4.4.0* + +It's important to make sure the parameters required for a Cloud function are provided, and are in the necessary format. Starting with Parse Server 4.4.0, you can now specify a validator function or object which will be called prior to your cloud function. + +Let's take a look at the `averageStars` example. If you wanted to make sure that `request.params.movie` is provided, and `averageStars` can only be called by logged in users, you could add a validator object to the function. + +```javascript +Parse.Cloud.define("averageStars", async (request) => { + const query = new Parse.Query("Review"); + query.equalTo("movie", request.params.movie); + const results = await query.find(); + let sum = 0; + for (let i = 0; i < results.length; ++i) { + sum += results[i].get("stars"); + } + return sum / results.length; +},{ + fields : ['movie'], + requireUser: true +}); +``` + +If the rules specified in the validator object aren't met, the Cloud Function won't run. This means that you can confidently build your function, knowing that `request.params.movie` is defined, as well as `request.user`. + +### More Advanced Validation + + +Often, not only is it important that `request.params.movie` is defined, but also that it's the correct data type. You can do this by providing an `Object` to the `fields` parameter in the Validator. + +```javascript +Parse.Cloud.define("averageStars", async (request) => { + const query = new Parse.Query("Review"); + query.equalTo("movie", request.params.movie); + const results = await query.find(); + let sum = 0; + for (let i = 0; i < results.length; ++i) { + sum += results[i].get("stars"); + } + return sum / results.length; +},{ + fields : { + movie : { + required: true, + type: String, + options: val => { + return val.length < 20; + }, + error: "Movie must be less than 20 characters" + } + }, + requireUserKeys: { + accType : { + options: 'reviewer', + error: 'Only reviewers can get average stars' + } + } +}); +``` + +This function will only run if: +- `request.params.movie` is defined +- `request.params.movie` is a String +- `request.params.movie` is less than 20 characters +- `request.user` is defined +- `request.user.get('accType')` is defined +- `request.user.get('accType')` is equal to 'reviewer' + +However, the requested user could set 'accType' to reviewer, and then recall the function. Here, you could provide validation on a `Parse.User` `beforeSave` trigger. `beforeSave` validators have a few additional options available, to help you make sure your data is secure. + +```javascript +Parse.Cloud.beforeSave(Parse.User, () => { + // any additional beforeSave logic here +}, { + fields: { + accType: { + default: 'viewer', + constant: true + }, + }, +}); +``` +This means that the field `accType` on `Parse.User` will be 'viewer' on signup, and will be unchangable, unless `masterKey` is provided. + +The full range of built-in Validation Options are: + +- `requireMaster`: whether the function requires a `masterKey` to run. +- `requireUser`: whether the function requires a `request.user` to run. +- `validateMasterKey`: whether the validator should run on `masterKey` (defaults to false). +- `fields`: an `Array` or `Object` of fields that are required on the request. +- `requireAnyUserRoles`: an `Array` or `function` that returns an array. `request.user` must match one of the specified roles. +- `requireAllUserRoles`: an `Array` or `function` that returns an array. `request.user` must match all of the specified roles. +- `requireUserKeys`: an `Array` of fields to be validated on `request.user`. + +The full range of built-in Validation Options on `.fields` are: + +- `type`: the type of the `request.params[field]` or `request.object.get(field)`. +- `default`: what the field should default to if it's `null`. +- `required`: whether the field is required. +- `options`: a singular option, array of options, or custom function of allowed values for the field. +- `constant`: whether the field is immutable. +- `error`: a custom error message if validation fails. + +You can also pass a function to the Validator. This can help you apply reoccuring logic to your Cloud Code. + +```javascript +const validationRules = request => { + if (request.master) { + return; + } + if (!request.user || request.user.id !== 'masterUser') { + throw 'Unauthorized'; + } +} + +Parse.Cloud.define('adminFunction', request => { +// do admin code here, confident that request.user.id is masterUser, or masterKey is provided +},validationRules) + +Parse.Cloud.define('adminFunctionTwo', request => { +// do admin code here, confident that request.user.id is masterUser, or masterKey is provided +},validationRules) + +``` + +### Considerations +- The validation function will run prior to your Cloud Code Functions. You can use async and promises here, but try to keep the validation as simple and fast as possible so your cloud requests resolve quickly. +- As previously mentioned, cloud validator objects will not validate if a masterKey is provided, unless `validateMasterKey:true` is set. However, if you set your validator to a function, the function will **always** run. + +This range of options should help you write more secure Cloud Code. If you need help in any way, feel free to reach out on our [developer supported community forum](https://community.parseplatform.org/). + # Cloud Jobs Sometimes you want to execute long running functions, and you don't want to wait for the response. Cloud Jobs are meant for just that. @@ -171,7 +303,7 @@ Viewing jobs is supported on parse-dashboard starting version 1.0.19, but you ca ## beforeSave -### Implementing validation +### Implementing data validation Another reason to run code in the cloud is to enforce a particular data format. For example, you might have both an Android and an iOS app, and you want to validate data for each of those. Rather than writing code once for each client environment, you can write it just once with Cloud Code. @@ -179,12 +311,16 @@ Let's take a look at our movie review example. When you're choosing how many sta ```javascript Parse.Cloud.beforeSave("Review", (request) => { - if (request.object.get("stars") < 1) { - throw "you cannot give less than one star"; - } - - if (request.object.get("stars") > 5) { - throw "you cannot give more than five stars"; +// do any additional beforeSave logic here +},{ + fields: { + stars : { + required:true, + options: stars => { + return stars >= 1 && stars =< 5; + }, + error: 'Your review must be between one and five stars' + } } }); @@ -216,7 +352,9 @@ If you want to use `beforeSave` for a predefined class in the Parse JavaScript S ```javascript Parse.Cloud.beforeSave(Parse.User, async (request) => { // code here -}) +}, + // Validation Object or Validation Function +) ``` ## afterSave @@ -289,17 +427,13 @@ const afterSave = function afterSave(request) { You can run custom Cloud Code before an object is deleted. You can do this with the `beforeDelete` method. For instance, this can be used to implement a restricted delete policy that is more sophisticated than what can be expressed through [ACLs]({{ site.apis.js }}/classes/Parse.ACL.html). For example, suppose you have a photo album app, where many photos are associated with each album, and you want to prevent the user from deleting an album if it still has a photo in it. You can do that by writing a function like this: ```javascript -Parse.Cloud.beforeDelete("Album", (request) => { +Parse.Cloud.beforeDelete("Album", async (request) => { const query = new Parse.Query("Photo"); query.equalTo("album", request.object); - query.count() - .then((count) => { - if (count > 0) { - throw "Can't delete album if it still has photos."; - }) - .catch((error) { - throw "Error " + error.code + " : " + error.message + " when getting photo count."; - }); + const count = await query.count({useMasterKey:true}) + if (count > 0) { + throw "Can't delete album if it still has photos."; + } }); ``` @@ -557,8 +691,7 @@ Parse.Cloud.beforeLogin(async request => { }); ``` -### Some considerations to be aware of - +### Considerations - It waits for any promises to resolve - The user is not available on the request object - the user has not yet been provided a session until after beforeLogin is successfully completed - Like `afterSave` on `Parse.User`, it will not save mutations to the user unless explicitly saved @@ -586,7 +719,7 @@ Parse.Cloud.afterLogout(async request => { }); ``` -### Some considerations to be aware of +### Considerations - Like with `afterDelete` triggers, the `_Session` object that is contained in the request has already been deleted. #### The trigger will run... @@ -667,7 +800,7 @@ Parse.Cloud.afterLiveQueryEvent('MyObject', (request) => { }); ``` -By default, ParseLiveQuery does not perform queries that require additional database operations. This is to keep your Parse Server as fast and effient as possible. If you require this functionality, you can perform these in `afterLiveQueryEvent`. +By default, ParseLiveQuery does not perform queries that require additional database operations. This is to keep your Parse Server as fast and efficient as possible. If you require this functionality, you can perform these in `afterLiveQueryEvent`. ```javascript // Including an object on LiveQuery event, on update only. @@ -683,7 +816,7 @@ Parse.Cloud.afterLiveQueryEvent('MyObject', async (request) => { // Extend matchesQuery functionality to LiveQuery Parse.Cloud.afterLiveQueryEvent('MyObject', async (request) => { - if (request.event != "Create") { + if (request.event != "create") { return; } const query = request.object.relation('children').query(); @@ -695,7 +828,7 @@ Parse.Cloud.afterLiveQueryEvent('MyObject', async (request) => { }); ``` -### Some considerations to be aware of +### Considerations - Live Query events won't trigger until the `afterLiveQueryEvent` trigger has completed. Make sure any functions inside the trigger are efficient and restrictive to prevent bottlenecks. ## onLiveQueryEvent @@ -736,13 +869,23 @@ To learn more, read the [Parse LiveQuery Protocol Specification](https://github. "connect" differs from "ws_connect", the former means that the client completed the connect procedure as defined by Parse Live Query protocol, where "ws_connect" just means that a new websocket was created. -# Using the Master Key in cloud code -Set `useMasterKey:true` in the requests that require master key. +# Security +## Master Key +To override object and class access permissions, you can set `useMasterKey: true` if the request accepts the master key option. + +### Examples -## Examples: +```javascript +query.find({ useMasterKey: true }); +``` ```javascript -query.find({useMasterKey:true}); -object.save(null,{useMasterKey:true}); -Parse.Object.saveAll(objects,{useMasterKey:true}); +object.save(null, { useMasterKey: true }); ``` + +```javascript +Parse.Object.saveAll(objects, { useMasterKey: true }); +``` + +### Considerations +- If you set `masterKey: true` when fetching objects with a query or relation in [Cloud Functions]({{ site.baseUrl }}/cloudcode/guide/#cloud-functions) or [Find Triggers]({{ site.baseUrl }}/cloudcode/guide/#find-triggers), the complete object will be returned. You may want to remove object properties that the client should not be able to access before sending it to the client. diff --git a/_includes/common/data.md b/_includes/common/data.md index 5e3bc2059..a705c3e02 100644 --- a/_includes/common/data.md +++ b/_includes/common/data.md @@ -36,14 +36,14 @@ You may import data into your Parse app by using CSV or JSON files. To create a The JSON format is an array of objects in our REST format or a JSON object with a `results` that contains an array of objects. It must adhere to the [JSON standard](http://json.org/). A file containing regular objects could look like: -```js +```jsonc { "results": [ { "score": 1337, "playerName": "Sean Plott", "cheatMode": false, - "createdAt": "2012-07-11T20:56:12.347Z", - "updatedAt": "2012-07-11T20:56:12.347Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "fchpZwSuGG" }] } @@ -63,7 +63,7 @@ In addition to the exposed fields, objects in the Parse User class can also have A file containing a `User` object could look like: -```js +```jsonc { "results": [{ "username": "cooldude", diff --git a/_includes/common/errors.md b/_includes/common/errors.md index ded95da4c..99000fe57 100644 --- a/_includes/common/errors.md +++ b/_includes/common/errors.md @@ -32,8 +32,6 @@ The following is a list of all the error codes that can be returned by the Parse | `ScriptFailed` | 141 | Cloud Code script failed. Usually points to a JavaScript error. Check error message for more details. | | `FunctionNotFound` | 141 | Cloud function not found. Check that the specified Cloud function is present in your Cloud Code script and has been deployed. | | `JobNotFound` | 141 | Background job not found. Check that the specified job is present in your Cloud Code script and has been deployed. | -| `SuccessErrorNotCalled` | 141 | success/error was not called. A cloud function will return once response.success() or response.error() is called. A background job will similarly finish execution once status.success() or status.error() is called. If a function or job never reaches either of the success/error methods, this error will be returned. This may happen when a function does not handle an error response correctly, preventing code execution from reaching the success() method call. | -| `MultupleSuccessErrorCalls` | 141 | Can't call success/error multiple times. A cloud function will return once response.success() or response.error() is called. A background job will similarly finish execution once status.success() or status.error() is called. If a function or job calls success() and/or error() more than once in a single execution path, this error will be returned. | | `ValidationFailed` | 142 | Cloud Code validation failed. | | `WebhookError` | 143 | Webhook error. | | `InvalidImageData` | 150 | Invalid image data. | @@ -79,7 +77,8 @@ The following is a list of all the error codes that can be returned by the Parse | `InvalidContentLength` | 128 | Invalid content length. | | `FileTooLarge` | 129 | File size exceeds maximum allowed. | | `FileSaveError` | 130 | Error saving a file. | -| `FileDeleteError` | 131 | File could not be deleted. | +| `FileDeleteError` | 153 | File could not be deleted. | +| `FileDeleteUnnamedError` | 161 | Unnamed file could not be deleted. | {: .docs_table} ## Installation related errors diff --git a/_includes/common/performance.md b/_includes/common/performance.md index 816252fc2..a348d8990 100644 --- a/_includes/common/performance.md +++ b/_includes/common/performance.md @@ -580,7 +580,7 @@ You should avoid using regular expression constraints that don't use indexes. Fo {% if page.language == "js" %} ```javascript -query.matches("playerName", "Michael", “i”); +query.matches("playerName", "Michael", "i"); ``` {% endif %} @@ -1008,19 +1008,15 @@ You can use this to offload processing to the Parse servers thus increasing your We saw examples of limiting the data returned by writing restrictive queries. You can also use [Cloud Functions]({{ site.baseUrl }}/cloudcode/guide/#cloud-functions) to help limit the amount of data returned to your app. In the following example, we use a Cloud Function to get a movie's average rating: ```javascript -Parse.Cloud.define("averageStars", function(request, response) { - var Review = Parse.Object.extend("Review"); - var query = new Parse.Query(Review); +Parse.Cloud.define("averageStars", async (request) => { + const query = new Parse.Query("Review"); query.equalTo("movie", request.params.movie); - query.find().then(function(results) { - var sum = 0; - for (var i = 0; i < results.length; ++i) { - sum += results[i].get("stars"); - } - response.success(sum / results.length); - }, function(error) { - response.error("movie lookup failed"); - }); + const results = await query.find(); + let sum = 0; + for (let i = 0; i < results.length; ++i) { + sum += results[i].get("stars"); + } + return sum / results.length; }); ``` @@ -1118,7 +1114,7 @@ Suppose you are displaying movie information in your app and your data model con ```javascript var Review = Parse.Object.extend("Review"); var query = new Parse.Query("Review"); -query.equalTo(“movie”, movie); +query.equalTo("movie", movie); query.count().then(function(count) { // Request succeeded }); @@ -1308,7 +1304,7 @@ Let's walk through an example of how you could build an efficient search. You ca ```javascript var _ = require("underscore"); -Parse.Cloud.beforeSave("Post", function(request, response) { +Parse.Cloud.beforeSave("Post", request => { var post = request.object; var toLowerCase = function(w) { return w.toLowerCase(); }; var words = post.get("text").split(/\b/); @@ -1321,7 +1317,6 @@ Parse.Cloud.beforeSave("Post", function(request, response) { hashtags = _.map(hashtags, toLowerCase); post.set("words", words); post.set("hashtags", hashtags); - response.success(); }); ``` @@ -1333,7 +1328,7 @@ Once you've got the keywords set up, you can efficiently look them up using “A ```javascript var Post = Parse.Object.extend("Post"); var query = new Parse.Query(Post); -query.containsAll("hashtags", [“#parse”, “#ftw”]); +query.containsAll("hashtags", ["#parse", "#ftw"]); query.find().then(function(results) { // Request succeeded }, function(error) { @@ -1405,7 +1400,7 @@ var results = await ParseObject.GetQuery("Post") ```php $query = new ParseQuery("Post"); -$query->containsAll("hashtags", [“#parse”, “#ftw”]); +$query->containsAll("hashtags", ["#parse", "#ftw"]); $posts = $query->find(); // posts containing all the given hash tags diff --git a/_includes/common/relations.md b/_includes/common/relations.md index 06541d512..3f9ed1c0b 100644 --- a/_includes/common/relations.md +++ b/_includes/common/relations.md @@ -1413,7 +1413,7 @@ IEnumerable books= await bookQuery.FindAsync(); {% if page.language == "js" %} ```js // set up our query for the Book object -cosnt bookQuery = new Parse.Query("Book"); +const bookQuery = new Parse.Query("Book"); // configure any constraints on your query... // tell the query to fetch all of the Author objects along with the Book diff --git a/_includes/common/security.md b/_includes/common/security.md index 42468c6b0..250288f31 100644 --- a/_includes/common/security.md +++ b/_includes/common/security.md @@ -389,7 +389,7 @@ All this is just the beginning. Applications can enforce all sorts of complex ac For the curious, here's the format for an ACL that restricts read and write permissions to the owner (whose `objectId` is identified by `"aSaMpLeUsErId"`) and enables other users to read the object: -```json +```jsonc { "*": { "read":true }, "aSaMpLeUsErId": { "read" :true, "write": true } @@ -398,7 +398,7 @@ For the curious, here's the format for an ACL that restricts read and write perm And here's another example of the format of an ACL that uses a Role: -```json +```jsonc { "role:RoleName": { "read": true }, "aSaMpLeUsErId": { "read": true, "write": true } @@ -413,7 +413,7 @@ Given that objects often already have pointers to the user(s) that should have p Pointer permissions are like virtual ACLs. They don't appear in the ACL column, but if you are familiar with how ACLs work, you can think of them like ACLs. In the above example with the `sender` and `receiver`, each object will act as if it has an ACL of: -```json +```jsonc { "": { "read": true, @@ -516,12 +516,10 @@ One particularly common use case for Cloud Code is preventing invalid data from To create validation functions, Cloud Code allows you to implement a `beforeSave` trigger for your class. These triggers are run whenever an object is saved, and allow you to modify the object or completely reject a save. For example, this is how you create a [Cloud Code beforeSave trigger]({{ site.baseUrl }}/cloudcode/guide/#beforesave-triggers) to make sure every user has an email address set: ```js -Parse.Cloud.beforeSave(Parse.User, function(request, response) { - var user = request.object; +Parse.Cloud.beforeSave(Parse.User, request => { + const user = request.object; if (!user.get("email")) { - response.error("Every user must have an email address."); - } else { - response.success(); + throw "Every user must have an email address."; } }); ``` @@ -548,17 +546,11 @@ Say you want to allow a user to "like" a `Post` object without giving them full The master key should be used carefully. setting `useMasterKey` to `true` only in the individual API function calls that need that security override: ```js -Parse.Cloud.define("like", function(request, response) { +Parse.Cloud.define("like", async request => { var post = new Parse.Object("Post"); post.id = request.params.postId; post.increment("likes"); - post.save(null, { useMasterKey: true }).then(function() { - // If I choose to do something else here, it won't be using - // the master key and I'll be subject to ordinary security measures. - response.success(); - }, function(error) { - response.error(error); - }); + await post.save(null, { useMasterKey: true }) }); ``` diff --git a/_includes/common/sessions.md b/_includes/common/sessions.md index a25f41b7f..1b87da6ba 100644 --- a/_includes/common/sessions.md +++ b/_includes/common/sessions.md @@ -2,7 +2,7 @@ Sessions represent an instance of a user logged into a device. Sessions are automatically created when users log in or sign up. They are automatically deleted when users log out. There is one distinct `Session` object for each user-installation pair; if a user issues a login request from a device they're already logged into, that user's previous `Session` object for that Installation is automatically deleted. `Session` objects are stored on Parse in the Session class, and you can view them on the Parse Dashboard Data Browser. We provide a set of APIs to manage `Session` objects in your app. -`Session` is a subclass of a Parse `Object`, so you can query, update, and delete sessions in the same way that you manipulate normal objects on Parse. Because Parse Server automatically creates sessions when you log in or sign up users, you should not manually create `Session` objects unless you are building a "Parse for IoT" app (e.g. Arduino or Embedded C). Deleting a `Session` will log the user out of the device that is currently using this session's token. +`Session` is a subclass of a Parse `Object`, so you can query, update, and delete sessions in the same way that you manipulate normal objects on Parse. Because Parse Server automatically creates sessions when you log in or sign up users, you should not manually create `Session` objects unless you are building an IoT app (e.g. Arduino or Embedded C). Deleting a `Session` will log the user out of the device that is currently using this session's token. Unlike other Parse objects, the `Session` class does not have Cloud Code triggers. So you cannot register a `beforeSave` or `afterSave` handler for the Session class. @@ -15,9 +15,6 @@ The `Session` object has these special fields: * `createdWith` (readonly): Information about how this session was created (e.g. `{ "action": "login", "authProvider": "password"}`). * `action` could have values: `login`, `signup`, `create`, or `upgrade`. The `create` action is when the developer manually creates the session by saving a `Session` object. The `upgrade` action is when the user is upgraded to revocable session from a legacy session token. * `authProvider` could have values: `password`, `anonymous`, `facebook`, or `twitter`. -* `restricted` (readonly): Boolean for whether this session is restricted. - * Restricted sessions do not have write permissions on `User`, `Session`, and `Role` classes on Parse. Restricted sessions also cannot read unrestricted sessions. - * All sessions that Parse Server automatically creates during user login/signup will be unrestricted. All sessions that the developer manually creates by saving a new `Session` object from the client (only needed for "Parse for IoT" apps) will be restricted. * `expiresAt` (readonly): Approximate UTC date when this `Session` object will be automatically deleted. You can configure session expiration settings (either 1-year inactivity expiration or no expiration) in your app's Parse Dashboard settings page. * `installationId` (can be set only once): String referring to the `Installation` where the session is logged in from. For Parse SDKs, this field will be automatically set when users log in or sign up. All special fields except `installationId` can only be set automatically by Parse Server. You can add custom fields onto `Session` objects, but please keep in mind that any logged-in device (with session token) can read other sessions that belong to the same user (unless you disable Class-Level Permissions, see below). @@ -294,24 +291,8 @@ try { When you log in a user via a `User` login method, Parse will automatically create a new unrestricted `Session` object in your Parse Server. Same for signups and Facebook/Twitter logins. -Session objects manually created from client SDKs (by creating an instance of `Session`, and saving it) are always restricted. You cannot manually create an unrestricted sessions using the object creation API. - -Restricted sessions are prohibited from creating, modifying, or deleting any data in the `User`, `Session`, and `Role` classes. Restricted session also cannot read unrestricted sessions. Restricted Sessions are useful for "Parse for IoT" devices (e.g Arduino or Embedded C) that may run in a less-trusted physical environment than mobile apps. However, please keep in mind that restricted sessions can still read data on `User`, `Session`, and `Role` classes, and can read/write data in any other class just like a normal session. So it is still important for IoT devices to be in a safe physical environment and ideally use encrypted storage to store the session token. - -If you want to prevent restricted Sessions from modifying classes other than `User`, `Session`, or `Role`, you can write a Cloud Code `beforeSave` handler for that class: - -```js -Parse.Cloud.beforeSave("MyClass", function(request, response) { - Parse.Session.current().then(function(session) { - if (session.get('restricted')) { - response.error('write operation not allowed'); - } - response.success(); - }); -}); -``` You can configure Class-Level Permissions (CLPs) for the Session class just like other classes on Parse. CLPs restrict reading/writing of sessions via the `Session` API, but do not restrict Parse Server's automatic session creation/deletion when users log in, sign up, and log out. We recommend that you disable all CLPs not needed by your app. Here are some common use cases for Session CLPs: * **Find**, **Delete** — Useful for building a UI screen that allows users to see their active session on all devices, and log out of sessions on other devices. If your app does not have this feature, you should disable these permissions. -* **Create** — Useful for "Parse for IoT" apps (e.g. Arduino or Embedded C) that provision restricted user sessions for other devices from the phone app. You should disable this permission when building apps for mobile and web. For "Parse for IoT" apps, you should check whether your IoT device actually needs to access user-specific data. If not, then your IoT device does not need a user session, and you should disable this permission. +* **Create** — Useful for apps that provision user sessions for other devices from the phone app. You should disable this permission when building apps for mobile and web. For IoT apps, you should check whether your IoT device actually needs to access user-specific data. If not, then your IoT device does not need a user session, and you should disable this permission. * **Get**, **Update**, **Add Field** — Unless you need these operations, you should disable these permissions. diff --git a/_includes/dotnet/objects.md b/_includes/dotnet/objects.md index 331dee6c7..b8b464ae3 100644 --- a/_includes/dotnet/objects.md +++ b/_includes/dotnet/objects.md @@ -28,9 +28,15 @@ await gameScore.SaveAsync(); After this code runs, you will probably be wondering if anything really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this: -```javascript -objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, -createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `GameScore` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. diff --git a/_includes/embedded_c/cloud-code.md b/_includes/embedded_c/cloud-code.md index d0ea10c98..877a6f249 100644 --- a/_includes/embedded_c/cloud-code.md +++ b/_includes/embedded_c/cloud-code.md @@ -7,8 +7,8 @@ You write your Cloud Code in JavaScript using the Parse JavaScript SDK. See our For example, you define a Cloud Function as below. ```cpp -Parse.Cloud.define("hello", function(request, response) { - response.success(request.body); +Parse.Cloud.define("hello", request => { + return request.body; }); ``` diff --git a/_includes/graphql/classes.md b/_includes/graphql/classes.md index 83035d6be..83945577a 100644 --- a/_includes/graphql/classes.md +++ b/_includes/graphql/classes.md @@ -1,7 +1,7 @@ # Classes Since your application does not have a schema yet, you can use the `createClass` mutation to create your first class through the GraphQL API. Run the following: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -34,7 +34,7 @@ mutation createGameScoreClass { } } ``` -```js +```jsonc // Response { "data": { diff --git a/_includes/graphql/customisation.md b/_includes/graphql/customisation.md index 944314315..c3479170b 100644 --- a/_includes/graphql/customisation.md +++ b/_includes/graphql/customisation.md @@ -109,7 +109,7 @@ By default, all of your Parse classes, including the defaults such as `Parse.Use In the following example, we limit our GraphQL schema to only expose the default `_User` class, along with a few custom classes: -```javascript +```jsonc { "enabledForClasses": ["_User", "Book", "Review", "Comment"], "disabledForClasses": null @@ -133,7 +133,7 @@ By default, we enrich the schema by generating a number of [Input Types](https:/ In the following example, we have a custom class called `Review` where the fields `rating` and `body` are allowed on the `create` mutation, and the field `numberOfLikes` on the `update` mutation: -```javascript +```jsonc { "classConfigs": [ { @@ -151,7 +151,7 @@ In the following example, we have a custom class called `Review` where the field You may decide to restrict which fields can be resolved when getting or finding records from a given class, for example, if you have a class called `Video` which includes a sensitive field `dmcaFlags`, you can hide this field by explicitly stating the fields that can be resolved: -```javascript +```jsonc { "classConfigs": [ { @@ -169,7 +169,7 @@ In production-grade environments where performance optimisation is critical, com In the following example, we set the fields `name` and `age` as the only two that can be used to filter the `_User` class, and defining the `createdAt` and `age` fields the only sortable field whilst disabling the ascending direction on the `createdAt` field: -```javascript +```jsonc { "classConfigs": [ { @@ -199,7 +199,7 @@ In the following example, we set the fields `name` and `age` as the only two tha By default, the schema exposes a `get` and `find` operation for each class, for example, `get_User` and `find_User`. You can disable either of these for any class in your schema, like so: -```javascript +```jsonc { "classConfigs": [ { @@ -222,7 +222,7 @@ By default, the schema exposes a `get` and `find` operation for each class, for By default, generated query names use pluralized version of `className`. You can override this behaviour with `getAlias`/`findAlias`. This is useful when your collection is named in plural or when singular/plural forms are same e.g. `Data`: -```javascript +```jsonc { "classConfigs": [ { @@ -246,7 +246,7 @@ By default, generated query names use pluralized version of `className`. You can By default, the schema exposes a `create`, `update` and `delete` operation for each class, for example, `create_User`, `update_User` and `delete_User`. You can disable any of these mutations for any class in your schema, like so: -```javascript +```jsonc { "classConfigs": [ { @@ -273,7 +273,7 @@ By default, the schema exposes a `create`, `update` and `delete` operation for e You can optionally override the default generated mutation names with aliases: -```javascript +```jsonc { "classConfigs": [ { @@ -326,7 +326,7 @@ extend type Query { Parse.Cloud.define("hello", () => "Hello, world!"); ``` -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -342,7 +342,7 @@ query hello { The code above should resolve to this: -```js +```jsonc // Response { "data": { @@ -418,7 +418,7 @@ Parse.Cloud.define("addToCart", async (req) => { }); ``` -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -437,7 +437,7 @@ mutation addItemToCart { The code above should resolve to something similar to this: -```js +```jsonc // Response { "data": { diff --git a/_includes/graphql/files.md b/_includes/graphql/files.md index 4c251f1da..b5dc5bedb 100644 --- a/_includes/graphql/files.md +++ b/_includes/graphql/files.md @@ -5,7 +5,7 @@ The GraphQL API supports file upload via [GraphQL Upload](https://github.com/jay ## Add a File field to a Class First of all we will update our `GameScore` class with a `screenshot` field of type `File`. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -29,7 +29,7 @@ mutation updateGameScoreClass { } } ``` -```js +```jsonc // Response { "data": { @@ -46,7 +46,7 @@ mutation updateGameScoreClass { The GraphQL API supports nested mutation for the `File` type, so you can send the file along with the Parse Object or just upload the file and get the returned information. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -65,7 +65,7 @@ mutation createFile($file: Upload!) { } } ``` -```js +```jsonc // Response { "data": { @@ -83,7 +83,7 @@ mutation createFile($file: Upload!) { You can add an existing file to an object. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -116,7 +116,7 @@ mutation createGameScore { } } ``` -```js +```jsonc // Response { "data": { @@ -134,7 +134,7 @@ mutation createGameScore { ## Create and add a file Lets create a new `GameScore` object and upload the file. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -164,7 +164,7 @@ mutation createGameScore($file: Upload! ) { } } ``` -```js +```jsonc // Response { "data": { diff --git a/_includes/graphql/health-check.md b/_includes/graphql/health-check.md index ff56c225d..819a546ca 100644 --- a/_includes/graphql/health-check.md +++ b/_includes/graphql/health-check.md @@ -2,7 +2,7 @@ Now that you have set up your GraphQL environment, it is time to run your first query. Execute the following code in your GraphQL Playground to check your API's health: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -16,7 +16,7 @@ query healthy { health } ``` -```js +```jsonc // Response { "data": { diff --git a/_includes/graphql/objects.md b/_includes/graphql/objects.md index 9f5df0daa..c86e7acba 100644 --- a/_includes/graphql/objects.md +++ b/_includes/graphql/objects.md @@ -6,7 +6,7 @@ For each class in your application's schema, Parse Server automatically generate For example, if you have a class named `GameScore` in the schema, Parse Server automatically generates a new mutation called `createGameScore`, and you should be able to run the code below in your GraphQL Playground: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -45,7 +45,7 @@ mutation createAGameScore { } } ``` -```js +```jsonc // Response { "data": { @@ -53,8 +53,8 @@ mutation createAGameScore { "clientMutationId": "anUniqueId", "gameScore": { "id": "R2FtZVNjb3JlOjZtdGlNcmtXNnY=", - "updatedAt": "2019-12-02T10:14:28.786Z", - "createdAt": "2019-12-02T10:14:28.786Z", + "updatedAt": "2022-01-01T12:23:45.678Z", + "createdAt": "2022-01-01T12:23:45.678Z", "playerName": "Sean Plott", "score": 1337, "cheatMode": false, @@ -78,7 +78,7 @@ For each class in your application's schema, Parse Server automatically generate For example, if you have a class named `GameScore` in the schema, Parse Server automatically generates a new mutation called `updateGameScore`. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -101,7 +101,7 @@ mutation updateAGameScore { } } ``` -```js +```jsonc // Response { "data": { @@ -122,7 +122,7 @@ For each class in your application's schema, Parse Server automatically generate For example, if you have a class named `GameScore` in the schema, Parse Server automatically generates a new mutation called `deleteGameScore`. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -143,7 +143,7 @@ mutation deleteAGameScore { The code above should resolve to something similar to this: -```js +```jsonc // Response { "data": { @@ -163,7 +163,7 @@ The code above should resolve to something similar to this: The GraphQL API supports nested mutations, so you can create objects with complex relationships in one request. Assuming that we have classes `Country`, `City` and `Company`. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -208,7 +208,7 @@ mutation aNestedMutation { } } ``` -```js +```jsonc // Response { "data": { diff --git a/_includes/graphql/queries.md b/_includes/graphql/queries.md index 915023d75..9dc656305 100644 --- a/_includes/graphql/queries.md +++ b/_includes/graphql/queries.md @@ -6,7 +6,7 @@ For each class in your application's schema, Parse Server automatically generate For example, if you have a class named `GameScore` in the schema, Parse Server automatically generates a new query called `gameScore`, and you should be able to run the code below in your GraphQL Playground: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -31,7 +31,7 @@ query getAGameScore { } } ``` -```js +```jsonc // Response { "data": { @@ -55,7 +55,7 @@ query getAGameScore { With the Relay specification you also have the choice to use [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) through the `node` GraphQL Query. For a `GameScore` object the following query will do the job. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -77,7 +77,7 @@ query getGameScoreWithNodeRelay { } ``` -```js +```jsonc // Response { "data": { @@ -94,7 +94,7 @@ query getGameScoreWithNodeRelay { Here using `Node Relay` is useful for writing generic requests for your front end components. For example, assuming we already have a `User` with a `Relay Node Id: X1VzZXI6Q1lMeWJYMjFjcw==` and `username: "johndoe"`. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -119,7 +119,7 @@ query genericGet { } } ``` -```js +```jsonc // Response { "data": { @@ -138,7 +138,7 @@ For each class in your application's schema, Parse Server automatically generate For example, if you have a class named `GameScore` in the schema, Parse Server automatically generates a new query called `gameScores`, and you should be able to run the code below in your GraphQL Playground: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -168,7 +168,7 @@ query getSomeGameScores{ } } ``` -```js +```jsonc // Response { "data": { @@ -218,7 +218,7 @@ query getSomeGameScores{ You can use the `where` argument to add constraints to a class find query. See the example below: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -244,7 +244,7 @@ query getSomeGameScores { } } ``` -```js +```jsonc // Response { "data": { @@ -271,7 +271,7 @@ Visit your GraphQL Playground if you want to know all the available constraints. You can use the `order` argument to select in which order the results are returned in a class find query. See the example below: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -300,7 +300,7 @@ query getSomeGameScores { } } ``` -```js +```jsonc // Response { "data": { @@ -346,7 +346,7 @@ You can combine multiple parameters like: `before & last` or `after & first`, as Note: `cursor` is different to `id`, it is a temporary pagination ID for the query. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -376,7 +376,7 @@ query getSomeGameScores { } } ``` -```js +```jsonc // Response { "data": { @@ -410,7 +410,7 @@ query getSomeGameScores { The GraphQL API supports nested queries, so you can find object and then execute query on relational child fields. Assuming that we have classes `Country`, `City`, `Company`: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -440,7 +440,7 @@ query aNestedQuery { } } ``` -```js +```jsonc // Response { "data": { @@ -479,7 +479,7 @@ Let's build a query matching countries that contain at least one city with more The GraphQL API can handle this type of complex relational query with ease. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -524,7 +524,7 @@ The GraphQL API can handle this type of complex relational query with ease. ... too many brackets here } ``` -```js +```jsonc // Response { "data": { @@ -562,7 +562,7 @@ Assuming that we have a `Country` class, `City` class, `Street` class, `House` c Let's build a query matching houses where the street has a city that has a country with a name equal to `France`. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -607,7 +607,7 @@ Let's build a query matching houses where the street has a city that has a count } ``` -```js +```jsonc // Response { "data": { diff --git a/_includes/graphql/relay.md b/_includes/graphql/relay.md index 8f1d2a0a3..73cdfe52d 100644 --- a/_includes/graphql/relay.md +++ b/_includes/graphql/relay.md @@ -2,7 +2,7 @@ The Parse Server GraphQL API follows latest standards currently available for highly-scalable APIs and ambitious front-end projects. -The Parse Open Source Team choose to follow the [GraphQL Server Relay Specification](https://relay.dev/docs/en/graphql-server-specification). +The Parse Open Source Team choose to follow the [GraphQL Server Relay Specification](https://relay.dev/docs/guides/graphql-server-specification). Relay is a JavaScript framework for building data-driven React applications powered by GraphQL, designed from the ground up to be easy to use, extensible and, most of all, performant. Relay accomplishes this with static queries and ahead-of-time code generation. diff --git a/_includes/graphql/users.md b/_includes/graphql/users.md index 5a3c9adf5..80c5e5b7e 100644 --- a/_includes/graphql/users.md +++ b/_includes/graphql/users.md @@ -12,7 +12,7 @@ You can ask Parse Server to [verify user email addresses]({{ site.baseUrl }}/par To sign up a new user, use the `signUp` mutation. For example: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -41,7 +41,7 @@ mutation signUp { } } ``` -```js +```jsonc // Response { "data": { @@ -64,7 +64,7 @@ Note that a field called `sessionToken` has been returned. This token can be use After you allow users to sign up, you need to let them log in to their account with a username and password in the future. To do this, use the `logIn` mutation: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -85,7 +85,7 @@ mutation logIn { } } ``` -```js +```jsonc // Response { "data": { @@ -108,7 +108,7 @@ Note that, when the user logs in, Parse Server generates a new `sessionToken` fo You can log in a user via a [3rd party authentication](https://docs.parseplatform.org/parse-server/guide/#supported-3rd-party-authentications) system (Facebook, Twitter, Apple and many more) with the `logInWith` mutation. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -140,7 +140,7 @@ mutation LoginWithFacebook { } } ``` -```js +```jsonc // Response { "data": { @@ -166,7 +166,7 @@ You can easily do this in the GraphQL Playground. There is an option called `HTT After setting up the `X-Parse-Session-Token` header, any operation will run as this user. For example, you can run the code below to validate the session token and return its associated user: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -185,7 +185,7 @@ query viewer { } } ``` -```js +```jsonc // Response { "data": { @@ -204,7 +204,7 @@ query viewer { You can log out a user through the `logOut` mutation. You need to send the `X-Parse-Session-Token` header and run code like the below example: -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -226,7 +226,7 @@ mutation logOut { } ``` -```js +```jsonc // Response { "data": { @@ -247,7 +247,7 @@ mutation logOut { To use the `resetPassword` mutation your Parse Server must have an email adapter configured. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -261,7 +261,7 @@ mutation resetPassword { } } ``` -```js +```jsonc // Response { "data": { @@ -276,7 +276,7 @@ mutation resetPassword { The verification email is automatically sent on sign up; this mutation is useful if the user didn't receive the first email. Again, an email adapter must be configured for this mutation to work. -```js +```jsonc // Header { "X-Parse-Application-Id": "APPLICATION_ID", @@ -291,7 +291,7 @@ mutation sendVerificationEmail { } ``` -```js +```jsonc // Response { "data": { diff --git a/_includes/ios/files.md b/_includes/ios/files.md index 2ab5bbc84..0a7ec31f0 100644 --- a/_includes/ios/files.md +++ b/_includes/ios/files.md @@ -142,7 +142,7 @@ file?.saveInBackground({ (success: Bool, error: Error?) in ``` -##Deleting Files +## Deleting Files If you know the name of a file you can delete it using the [REST API]({{site.baseUrl}}/rest/guide/#deleting-files). Your master key is required for this operation. diff --git a/_includes/ios/objects.md b/_includes/ios/objects.md index 0b9278571..4316cb3be 100644 --- a/_includes/ios/objects.md +++ b/_includes/ios/objects.md @@ -49,9 +49,15 @@ gameScore.saveInBackground { (succeeded, error) in After this code runs, you will probably be wondering if anything really happened. If [Parse Dashboard](https://github.com/parse-community/parse-dashboard) is implemented for your server, you can verify the data was saved in the data browser. You should see something like this: -```js -objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, -createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `GameScore` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. diff --git a/_includes/js/analytics.md b/_includes/js/analytics.md index cf701ad0f..22ed97202 100644 --- a/_includes/js/analytics.md +++ b/_includes/js/analytics.md @@ -14,7 +14,7 @@ Without having to implement any client-side logic, you can view real-time graphs Say your app offers search functionality for apartment listings, and you want to track how often the feature is used, with some additional metadata. ```javascript -var dimensions = { +const dimensions = { // Define ranges to bucket data points into meaningful segments priceRange: '1000-1500', // Did the user filter the query? @@ -29,7 +29,7 @@ Parse.Analytics.track('search', dimensions); `Parse.Analytics` can even be used as a lightweight error tracker — simply invoke the following and you'll have access to an overview of the rate and frequency of errors, broken down by error code, in your application: ```javascript -var codeString = '' + error.code; +const codeString = '' + error.code; Parse.Analytics.track('error', { code: codeString }); ``` diff --git a/_includes/js/files.md b/_includes/js/files.md index 46e3f3be8..04efa8164 100644 --- a/_includes/js/files.md +++ b/_includes/js/files.md @@ -7,21 +7,21 @@ Getting started with `Parse.File` is easy. There are a couple of ways to create a file. The first is with a base64-encoded String. ```javascript -var base64 = "V29ya2luZyBhdCBQYXJzZSBpcyBncmVhdCE="; -var file = new Parse.File("myfile.txt", { base64: base64 }); +const base64 = "V29ya2luZyBhdCBQYXJzZSBpcyBncmVhdCE="; +const file = new Parse.File("myfile.txt", { base64: base64 }); ``` Alternatively, you can create a file from an array of byte values: ```javascript -var bytes = [ 0xBE, 0xEF, 0xCA, 0xFE ]; -var file = new Parse.File("myfile.txt", bytes); +const bytes = [ 0xBE, 0xEF, 0xCA, 0xFE ]; +const file = new Parse.File("myfile.txt", bytes); ``` Parse will auto-detect the type of file you are uploading based on the file extension, but you can specify the `Content-Type` with a third parameter: ```javascript -var file = new Parse.File("myfile.zzz", fileData, "image/png"); +const file = new Parse.File("myfile.zzz", fileData, "image/png"); ``` ### Client Side @@ -34,12 +34,12 @@ In a browser, you'll want to use an html form with a file upload control. To do Then, in a click handler or other function, get a reference to that file: ```javascript -var fileUploadControl = $("#profilePhotoFileUpload")[0]; +const fileUploadControl = $("#profilePhotoFileUpload")[0]; if (fileUploadControl.files.length > 0) { - var file = fileUploadControl.files[0]; - var name = "photo.jpg"; + const file = fileUploadControl.files[0]; + const name = "photo.jpg"; - var parseFile = new Parse.File(name, file); + const parseFile = new Parse.File(name, file); } ``` @@ -88,7 +88,7 @@ request(options) Finally, after the save completes, you can associate a `Parse.File` with a `Parse.Object` just like any other piece of data: ```javascript -var jobApplication = new Parse.Object("JobApplication"); +const jobApplication = new Parse.Object("JobApplication"); jobApplication.set("applicantName", "Joe Smith"); jobApplication.set("applicantResumeFile", parseFile); jobApplication.save(); @@ -99,7 +99,7 @@ jobApplication.save(); How to best retrieve the file contents back depends on the context of your application. Because of cross-domain request issues, it's best if you can make the browser do the work for you. Typically, that means rendering the file's URL into the DOM. Here we render an uploaded profile photo on a page with jQuery: ```javascript -var profilePhoto = profile.get("photoFile"); +const profilePhoto = profile.get("photoFile"); $("profileImg")[0].src = profilePhoto.url(); ``` @@ -113,9 +113,16 @@ Parse.Cloud.httpRequest({ url: profilePhoto.url() }).then(function(response) { ## Deleting Files -You can delete files that are referenced by objects using the [REST API]({{ site.baseUrl }}/rest/guide/#deleting-files). You will need to provide the master key in order to be allowed to delete a file. +You can delete files that are referenced by objects using the `destroy` method. The master key is required to delete a file. -If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. +```javascript +const profilePhoto = profile.get("photoFile"); +await profilePhoto.destroy({ useMasterKey: true }); +``` + +#### Parse Server <4.2.0 + +Use the [REST API]({{ site.baseUrl }}/rest/guide/#deleting-files) to delete a file. ## Adding Metadata and Tags diff --git a/_includes/js/geopoints.md b/_includes/js/geopoints.md index c68439748..9accb70cb 100644 --- a/_includes/js/geopoints.md +++ b/_includes/js/geopoints.md @@ -7,7 +7,7 @@ Parse allows you to associate real-world latitude and longitude coordinates with To associate a point with an object you first need to create a `Parse.GeoPoint`. For example, to create a point with latitude of 40.0 degrees and -30.0 degrees longitude: ```javascript -var point = new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}); +const point = new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}); ``` This point is then stored in the object as a regular field. @@ -67,10 +67,10 @@ const pizzaPlacesInSF = query.find(); It's also possible to query for the set of objects that are contained within a particular area. To find the objects in a rectangular bounding box, add the `withinGeoBox` restriction to your `Parse.Query`. ```javascript -var southwestOfSF = new Parse.GeoPoint(37.708813, -122.526398); -var northeastOfSF = new Parse.GeoPoint(37.822802, -122.373962); +const southwestOfSF = new Parse.GeoPoint(37.708813, -122.526398); +const northeastOfSF = new Parse.GeoPoint(37.822802, -122.373962); -var query = new Parse.Query(PizzaPlaceObject); +const query = new Parse.Query(PizzaPlaceObject); query.withinGeoBox("location", southwestOfSF, northeastOfSF); const pizzaPlacesInSF = await query.find(); ``` diff --git a/_includes/js/getting-started.md b/_includes/js/getting-started.md index f66423e27..f99c92319 100644 --- a/_includes/js/getting-started.md +++ b/_includes/js/getting-started.md @@ -8,20 +8,22 @@ The JavaScript ecosystem is wide and incorporates a large number of platforms an To use the npm modules for a browser based application, include it as you normally would: ```js -var Parse = require('parse'); +const Parse = require('parse'); ``` For server-side applications or Node.js command line tools, include `'parse/node'`: ```js // In a node.js environment -var Parse = require('parse/node'); +const Parse = require('parse/node'); +// ES6 Minimized +import Parse from 'parse/dist/parse.min.js'; ``` For React Native applications, include `'parse/react-native.js'`: ```js // In a React Native application -var Parse = require('parse/react-native.js'); +const Parse = require('parse/react-native.js'); ``` Additionally on React-Native / Expo environments, make sure to add the piece of code below : diff --git a/_includes/js/objects.md b/_includes/js/objects.md index 37712b6d2..c8df01b11 100644 --- a/_includes/js/objects.md +++ b/_includes/js/objects.md @@ -18,13 +18,13 @@ To create a new subclass, use the `Parse.Object.extend` method. Any `Parse.Quer ```javascript // Simple syntax to create a new subclass of Parse.Object. -var GameScore = Parse.Object.extend("GameScore"); +const GameScore = Parse.Object.extend("GameScore"); // Create a new instance of that class. -var gameScore = new GameScore(); +const gameScore = new GameScore(); // Alternatively, you can use the typical Backbone syntax. -var Achievement = Parse.Object.extend({ +const Achievement = Parse.Object.extend({ className: "Achievement" }); ``` @@ -34,7 +34,7 @@ You can add additional methods and properties to your subclasses of `Parse.Objec ```javascript // A complex subclass of Parse.Object -var Monster = Parse.Object.extend("Monster", { +const Monster = Parse.Object.extend("Monster", { // Instance methods hasSuperHumanStrength: function () { return this.get("strength") > 18; @@ -46,13 +46,13 @@ var Monster = Parse.Object.extend("Monster", { }, { // Class methods spawn: function(strength) { - var monster = new Monster(); + const monster = new Monster(); monster.set("strength", strength); return monster; } }); -var monster = Monster.spawn(200); +const monster = Monster.spawn(200); alert(monster.get('strength')); // Displays 200. alert(monster.sound); // Displays Rawr. ``` @@ -75,7 +75,7 @@ class Monster extends Parse.Object { } static spawn(strength) { - var monster = new Monster(); + const monster = new Monster(); monster.set('strength', strength); return monster; } @@ -144,9 +144,15 @@ gameScore.save() After this code runs, you will probably be wondering if anything really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this: -```json -objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, -createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `GameScore` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. @@ -156,8 +162,8 @@ There are also a few fields you don't need to specify that are provided as a con If you prefer, you can set attributes directly in your call to `save` instead. ```javascript -var GameScore = Parse.Object.extend("GameScore"); -var gameScore = new GameScore(); +const GameScore = Parse.Object.extend("GameScore"); +const gameScore = new GameScore(); gameScore.save({ score: 1337, @@ -176,13 +182,13 @@ gameScore.save({ You may add a `Parse.Object` as the value of a property in another `Parse.Object`. By default, when you call `save()` on the parent object, all nested objects will be created and/or saved as well in a batch operation. This feature makes it really easy to manage relational data as you don't have to take care of creating the objects in any specific order. ```javascript -var Child = Parse.Object.extend("Child"); -var child = new Child(); +const Child = Parse.Object.extend("Child"); +const child = new Child(); -var Parent = Parse.Object.extend("Parent"); -var parent = new Parent(); +const Parent = Parse.Object.extend("Parent"); +const parent = new Parent(); -parent.save({child: child}); +parent.save({ child: child }); // Automatically the object Child is created on the server // just before saving the Parent ``` @@ -190,8 +196,8 @@ parent.save({child: child}); In some scenarios, you may want to prevent this default chain save. For example, when saving a team member's profile that points to an account owned by another user to which you don't have write access. In this case, setting the option `cascadeSave` to `false` may be useful: ```javascript -var TeamMember = Parse.Object.extend("TeamMember"); -var teamMember = new TeamMember(); +const TeamMember = Parse.Object.extend("TeamMember"); +const teamMember = new TeamMember(); teamMember.set('ownerAccount', ownerAccount); // Suppose `ownerAccount` has been created earlier. teamMember.save(null, { cascadeSave: false }); @@ -206,11 +212,11 @@ teamMember.save(null, { cascadeSave: false }); You may pass a `context` dictionary that is accessible in Cloud Code `beforeSave` and `afterSave` triggers for that `Parse.Object`. This is useful if you want to condition certain operations in Cloud Code triggers on ephemeral information that should not be saved with the `Parse.Object` in the database. The context is ephemeral in the sense that it vanishes after the Cloud Code triggers for that particular `Parse.Object` have executed. For example: ```javascript -var TeamMember = Parse.Object.extend("TeamMember"); -var teamMember = new TeamMember(); +const TeamMember = Parse.Object.extend("TeamMember"); +const teamMember = new TeamMember(); teamMember.set("team", "A"); -var context = { notifyTeam: false }; +const context = { notifyTeam: false }; await teamMember.save(null, { context: context }); ``` @@ -218,10 +224,10 @@ The context is then accessible in Cloud Code: ```javascript Parse.Cloud.afterSave("TeamMember", async (req) => { - var notifyTeam = req.context.notifyTeam; - if (notifyTeam) { - // Notify team about new member. - } + const notifyTeam = req.context.notifyTeam; + if (notifyTeam) { + // Notify team about new member. + } }); ``` @@ -230,8 +236,8 @@ Parse.Cloud.afterSave("TeamMember", async (req) => { Saving data to the cloud is fun, but it's even more fun to get that data out again. If the `Parse.Object` has been uploaded to the server, you can use the `objectId` to get it using a `Parse.Query`: ```javascript -var GameScore = Parse.Object.extend("GameScore"); -var query = new Parse.Query(GameScore); +const GameScore = Parse.Object.extend("GameScore"); +const query = new Parse.Query(GameScore); query.get("xWMyZ4YEGZ") .then((gameScore) => { // The object was retrieved successfully. @@ -244,18 +250,24 @@ query.get("xWMyZ4YEGZ") To get the values out of the `Parse.Object`, use the `get` method. ```javascript -var score = gameScore.get("score"); -var playerName = gameScore.get("playerName"); -var cheatMode = gameScore.get("cheatMode"); +const score = gameScore.get("score"); +const playerName = gameScore.get("playerName"); +const cheatMode = gameScore.get("cheatMode"); +``` + +Alternatively, the `attributes` property of the `Parse.Object` can be treated as a Javascript object, and even destructured. + +```javascript +const { score, playerName, cheatMode } = result.attributes; ``` The four special reserved values are provided as properties and cannot be retrieved using the 'get' method nor modified with the 'set' method: ```javascript -var objectId = gameScore.id; -var updatedAt = gameScore.updatedAt; -var createdAt = gameScore.createdAt; -var acl = gameScore.getACL(); +const objectId = gameScore.id; +const updatedAt = gameScore.updatedAt; +const createdAt = gameScore.createdAt; +const acl = gameScore.getACL(); ``` If you need to refresh an object you already have with the latest data that @@ -284,8 +296,8 @@ Updating an object is simple. Just set some new data on it and call the save met ```javascript // Create the object. -var GameScore = Parse.Object.extend("GameScore"); -var gameScore = new GameScore(); +const GameScore = Parse.Object.extend("GameScore"); +const gameScore = new GameScore(); gameScore.set("score", 1337); gameScore.set("playerName", "Sean Plott"); @@ -372,16 +384,16 @@ To create a new `Post` with a single `Comment`, you could write: ```javascript // Declare the types. -var Post = Parse.Object.extend("Post"); -var Comment = Parse.Object.extend("Comment"); +const Post = Parse.Object.extend("Post"); +const Comment = Parse.Object.extend("Comment"); // Create the post -var myPost = new Post(); +const myPost = new Post(); myPost.set("title", "I'm Hungry"); myPost.set("content", "Where should we go for lunch?"); // Create the comment -var myComment = new Comment(); +const myComment = new Comment(); myComment.set("content", "Let's do Sushirrito."); // Add the post as a value in the comment @@ -394,7 +406,7 @@ myComment.save(); Internally, the Parse framework will store the referred-to object in just one place, to maintain consistency. You can also link objects using just their `objectId`s like so: ```javascript -var post = new Post(); +const post = new Post(); post.id = "1zEcyElZ80"; myComment.set("parent", post); @@ -413,8 +425,8 @@ const title = post.get("title"); Many-to-many relationships are modeled using `Parse.Relation`. This works similar to storing an array of `Parse.Object`s in a key, except that you don't need to fetch all of the objects in a relation at once. In addition, this allows `Parse.Relation` to scale to many more objects than the array of `Parse.Object` approach. For example, a `User` may have many `Posts` that she might like. In this case, you can store the set of `Posts` that a `User` likes using `relation`. In order to add a `Post` to the "likes" list of the `User`, you can do: ```javascript -var user = Parse.User.current(); -var relation = user.relation("likes"); +const user = Parse.User.current(); +const relation = user.relation("likes"); relation.add(post); user.save(); ``` @@ -454,7 +466,7 @@ relation.query().find({ If you want only a subset of the Posts, you can add extra constraints to the `Parse.Query` returned by query like this: ```javascript -var query = relation.query(); +const query = relation.query(); query.equalTo("title", "I'm Hungry"); query.find({ success:function(list) { @@ -483,16 +495,16 @@ So far we've used values with type `String`, `Number`, and `Parse.Object`. Parse Some examples: ```javascript -var number = 42; -var bool = false; -var string = "the number is " + number; -var date = new Date(); -var array = [string, number]; -var object = { number: number, string: string }; -var pointer = MyClassName.createWithoutData(objectId); +const number = 42; +const bool = false; +const string = "the number is " + number; +const date = new Date(); +const array = [string, number]; +const object = { number: number, string: string }; +const pointer = MyClassName.createWithoutData(objectId); -var BigObject = Parse.Object.extend("BigObject"); -var bigObject = new BigObject(); +const BigObject = Parse.Object.extend("BigObject"); +const bigObject = new BigObject(); bigObject.set("myNumber", number); bigObject.set("myBool", bool); bigObject.set("myString", string); diff --git a/_includes/js/promises.md b/_includes/js/promises.md index 490e5e8af..d106f6805 100644 --- a/_includes/js/promises.md +++ b/_includes/js/promises.md @@ -79,7 +79,7 @@ obj.save().then(function(obj) { Promises are a little bit magical, in that they let you chain them without nesting. If a callback for a promise returns a new promise, then the first one will not be resolved until the second one is. This lets you perform multiple actions without incurring the pyramid code you would get with callbacks. ```javascript -var query = new Parse.Query("Student"); +const query = new Parse.Query("Student"); query.descending("gpa"); query.find().then(function(students) { students[0].set("valedictorian", true); @@ -144,7 +144,7 @@ Parse.User.logIn("user", "pass").then(function(user) { Generally, developers consider a failing promise to be the asynchronous equivalent to throwing an exception. In fact, if a callback passed to `then` throws an error, the promise returned will fail with that error. If any Promise in a chain returns an error, all of the success callbacks after it will be skipped until an error callback is encountered. The error callback can transform the error, or it can handle it by returning a new Promise that isn't rejected. You can think of rejected promises kind of like throwing an exception. An error callback is like a catch block that can handle the error or rethrow it. ```javascript -var query = new Parse.Query("Student"); +const query = new Parse.Query("Student"); query.descending("gpa"); query.find().then(function(students) { students[0].set("valedictorian", true); @@ -224,7 +224,7 @@ query.find().then(function(results) { With these tools, it's easy to make your own asynchronous functions that return promises. For example, you can make a promisified version of `setTimeout`. ```javascript -var delay = function(millis) { +const delay = function(millis) { return new Promise((resolve) => { setTimeout(resolve, millis); }); diff --git a/_includes/js/push-notifications.md b/_includes/js/push-notifications.md index d18745236..e9a9f5e41 100644 --- a/_includes/js/push-notifications.md +++ b/_includes/js/push-notifications.md @@ -91,7 +91,7 @@ The JavaScript SDK does not currently support modifying `Installation` objects. Once you have your data stored on your `Installation` objects, you can use a query to target a subset of these devices. `Parse.Installation` queries work just like any other [Parse query](#queries). ```javascript -var query = new Parse.Query(Parse.Installation); +const query = new Parse.Query(Parse.Installation); query.equalTo('injuryReports', true); Parse.Push.send({ @@ -110,7 +110,7 @@ Parse.Push.send({ We can even use channels with our query. To send a push to all subscribers of the "Giants" channel but filtered by those who want score update, we can do the following: ```javascript -var query = new Parse.Query(Parse.Installation); +const query = new Parse.Query(Parse.Installation); query.equalTo('channels', 'Giants'); // Set our channel query.equalTo('scores', true); @@ -131,11 +131,11 @@ If we store relationships to other objects in our `Installation` class, we can a ```javascript // Find users near a given location -var userQuery = new Parse.Query(Parse.User); +const userQuery = new Parse.Query(Parse.User); userQuery.withinMiles("location", stadiumLocation, 1.0); // Find devices associated with these users -var pushQuery = new Parse.Query(Parse.Installation); +const pushQuery = new Parse.Query(Parse.Installation); pushQuery.matchesQuery('user', userQuery); // Send push notification to query @@ -192,7 +192,7 @@ Parse.Push.send({ It is also possible to specify your own data in this dictionary. As explained in the Receiving Notifications section for [iOS]({{ site.baseUrl }}/ios/guide/#receiving-pushes) and [Android]({{ site.baseUrl }}/android/guide/#receiving-pushes), iOS will give you access to this data only when the user opens your app via the notification and Android will provide you this data in the `Intent` if one is specified. ```javascript -var query = new Parse.Query(Parse.Installation); +const query = new Parse.Query(Parse.Installation); query.equalTo('channels', 'Indians'); query.equalTo('injuryReports', true); @@ -219,7 +219,7 @@ When a user's device is turned off or not connected to the internet, push notifi There are two parameters provided by Parse to allow setting an expiration date for your notification. The first is `expiration_time` which takes a `Date` specifying when Parse should stop trying to send the notification. To expire the notification exactly 1 week from now, you can use the following: ```javascript -var oneWeekAway = new Date(...); +const oneWeekAway = new Date(...); Parse.Push.send({ where: everyoneQuery, @@ -238,8 +238,8 @@ Parse.Push.send({ Alternatively, you can use the `expiration_interval` parameter to specify a duration of time before your notification expires. This value is relative to the `push_time` parameter used to [schedule notifications](#scheduling-pushes). This means that a push notification scheduled to be sent out in 1 day and an expiration interval of 6 days can be received up to a week from now. ```javascript -var oneDayAway = new Date(...); -var sixDaysAwayEpoch = (new Date(...)).getTime(); +const oneDayAway = new Date(...); +const sixDaysAwayEpoch = (new Date(...)).getTime(); Parse.Push.send({ push_time: oneDayAway, @@ -263,7 +263,7 @@ The following examples would send a different notification to Android and iOS us ```javascript // Notification for Android users -var queryAndroid = new Parse.Query(Parse.Installation); +const queryAndroid = new Parse.Query(Parse.Installation); queryAndroid.equalTo('deviceType', 'android'); Parse.Push.send({ @@ -274,7 +274,7 @@ Parse.Push.send({ }); // Notification for iOS users -var queryIOS = new Parse.Query(Parse.Installation); +const queryIOS = new Parse.Query(Parse.Installation); queryIOS.equalTo('deviceType', 'ios'); Parse.Push.send({ @@ -285,7 +285,7 @@ Parse.Push.send({ }); // Notification for Windows 8 users -var queryWindows = new Parse.Query(Parse.Installation); +const queryWindows = new Parse.Query(Parse.Installation); queryWindows.equalTo('deviceType', 'winrt'); Parse.Push.send({ @@ -296,7 +296,7 @@ Parse.Push.send({ }); // Notification for Windows Phone 8 users -var queryWindowsPhone = new Parse.Query(Parse.Installation); +const queryWindowsPhone = new Parse.Query(Parse.Installation); queryWindowsPhone.equalTo('deviceType', 'winphone'); Parse.Push.send({ @@ -312,9 +312,9 @@ Parse.Push.send({ You can schedule a push in advance by specifying a `push_time`. For example, if a user schedules a game reminder for a game tomorrow at noon UTC, you can schedule the push notification by sending: ```javascript -var tomorrowDate = new Date(...); +const tomorrowDate = new Date(...); -var query = new Parse.Query(Parse.Installation); +const query = new Parse.Query(Parse.Installation); query.equalTo('user', user); Parse.Push.send({ diff --git a/_includes/js/queries.md b/_includes/js/queries.md index 56ea5c325..0067adc3c 100644 --- a/_includes/js/queries.md +++ b/_includes/js/queries.md @@ -16,7 +16,7 @@ const results = await query.find(); alert("Successfully retrieved " + results.length + " scores."); // Do something with the returned Parse.Object values for (let i = 0; i < results.length; i++) { - var object = results[i]; + const object = results[i]; alert(object.id + ' - ' + object.get('playerName')); } ``` @@ -146,7 +146,7 @@ const results = await userQuery.find(); Conversely, to get objects where a key does not match the value of a key in a set of objects resulting from another query, use `doesNotMatchKeyInQuery`. For example, to find users whose hometown teams have losing records: ```javascript -var losingUserQuery = new Parse.Query(Parse.User); +const losingUserQuery = new Parse.Query(Parse.User); losingUserQuery.doesNotMatchKeyInQuery("hometown", "city", teamQuery); // results has the list of users with a hometown team with a losing record const results = await losingUserQuery.find(); @@ -168,8 +168,8 @@ groupsWithRoleX.find().then(function(results) { You can restrict the fields returned by calling `select` with a list of keys. To retrieve documents that contain only the `score` and `playerName` fields (and also special built-in fields such as `objectId`, `createdAt`, and `updatedAt`): ```javascript -var GameScore = Parse.Object.extend("GameScore"); -var query = new Parse.Query(GameScore); +const GameScore = Parse.Object.extend("GameScore"); +const query = new Parse.Query(GameScore); query.select("score", "playerName"); query.find().then(function(results) { // each of results will only have the selected fields available. @@ -179,8 +179,8 @@ query.find().then(function(results) { Similarly, use `exclude` to remove undesired fields while retrieving the rest: ```javascript -var GameScore = Parse.Object.extend("GameScore"); -var query = new Parse.Query(GameScore); +const GameScore = Parse.Object.extend("GameScore"); +const query = new Parse.Query(GameScore); query.exclude("playerName"); query.find().then(function(results) { // Now each result will have all fields except `playerName` @@ -221,7 +221,7 @@ Use `startsWith` to restrict to string values that start with a particular strin ```javascript // Finds barbecue sauces that start with "Big Daddy's". -var query = new Parse.Query(BarbecueSauce); +const query = new Parse.Query(BarbecueSauce); query.startsWith("name", "Big Daddy's"); ``` @@ -238,7 +238,7 @@ You can use `fullText` for efficient search capabilities. Text indexes are autom * Parse Server 2.5.0+ ```javascript -var query = new Parse.Query(BarbecueSauce); +const query = new Parse.Query(BarbecueSauce); query.fullText('name', 'bbq'); ``` @@ -246,7 +246,7 @@ The above example will match any `BarbecueSauce` objects where the value in the ```javascript // You can sort by weight / rank. ascending() and select() -var query = new Parse.Query(BarbecueSauce); +const query = new Parse.Query(BarbecueSauce); query.fullText('name', 'bbq'); query.ascending('$score'); query.select('$score'); @@ -268,7 +268,7 @@ There are several ways to issue queries for relational data. If you want to retr ```javascript // Assume Parse.Object myPost was previously created. -var query = new Parse.Query(Comment); +const query = new Parse.Query(Comment); query.equalTo("post", myPost); // comments now contains the comments for myPost const comments = await query.find(); @@ -277,11 +277,11 @@ const comments = await query.find(); If you want to retrieve objects where a field contains a `Parse.Object` that matches a different query, you can use `matchesQuery`. In order to find comments for posts containing images, you can do: ```javascript -var Post = Parse.Object.extend("Post"); -var Comment = Parse.Object.extend("Comment"); -var innerQuery = new Parse.Query(Post); +const Post = Parse.Object.extend("Post"); +const Comment = Parse.Object.extend("Comment"); +const innerQuery = new Parse.Query(Post); innerQuery.exists("image"); -var query = new Parse.Query(Comment); +const query = new Parse.Query(Comment); query.matchesQuery("post", innerQuery); // comments now contains the comments for posts with images. const comments = await query.find(); @@ -290,11 +290,11 @@ const comments = await query.find(); If you want to retrieve objects where a field contains a `Parse.Object` that does not match a different query, you can use `doesNotMatchQuery`. In order to find comments for posts without images, you can do: ```javascript -var Post = Parse.Object.extend("Post"); -var Comment = Parse.Object.extend("Comment"); -var innerQuery = new Parse.Query(Post); +const Post = Parse.Object.extend("Post"); +const Comment = Parse.Object.extend("Comment"); +const innerQuery = new Parse.Query(Post); innerQuery.exists("image"); -var query = new Parse.Query(Comment); +const query = new Parse.Query(Comment); query.doesNotMatchQuery("post", innerQuery); // comments now contains the comments for posts without images. const comments = await query.find(); @@ -303,7 +303,7 @@ const comments = await query.find(); You can also do relational queries by `objectId`: ```javascript -var post = new Post(); +const post = new Post(); post.id = "1zEcyElZ80"; query.equalTo("post", post); ``` @@ -311,7 +311,7 @@ query.equalTo("post", post); In some situations, you want to return multiple types of related objects in one query. You can do this with the `include` method. For example, let's say you are retrieving the last ten comments, and you want to retrieve their related posts at the same time: ```javascript -var query = new Parse.Query(Comment); +const query = new Parse.Query(Comment); // Retrieve the most recent ones query.descending("createdAt"); @@ -325,9 +325,9 @@ query.include("post"); // Comments now contains the last ten comments, and the "post" field const comments = await query.find(); // has been populated. For example: -for (var i = 0; i < comments.length; i++) { +for (let i = 0; i < comments.length; i++) { // This does not require a network access. - var post = comments[i].get("post"); + const post = comments[i].get("post"); } ``` @@ -346,8 +346,8 @@ Note: In the old Parse hosted backend, count queries were rate limited to a maxi If you just need to count how many objects match a query, but you do not need to retrieve all the objects that match, you can use `count` instead of `find`. For example, to count how many games have been played by a particular player: ```javascript -var GameScore = Parse.Object.extend("GameScore"); -var query = new Parse.Query(GameScore); +const GameScore = Parse.Object.extend("GameScore"); +const query = new Parse.Query(GameScore); query.equalTo("playerName", "Sean Plott"); const count = await query.count(); alert("Sean has played " + count + " games"); @@ -366,13 +366,13 @@ Note that we do not support GeoPoint or non-filtering constraints (e.g. `near`, If you want to find objects that match one of several queries, you can use `Parse.Query.or` method to construct a query that is an OR of the queries passed in. For instance if you want to find players who either have a lot of wins or a few wins, you can do: ```javascript -var lotsOfWins = new Parse.Query("Player"); +const lotsOfWins = new Parse.Query("Player"); lotsOfWins.greaterThan("wins", 150); -var fewWins = new Parse.Query("Player"); +const fewWins = new Parse.Query("Player"); fewWins.lessThan("wins", 5); -var mainQuery = Parse.Query.or(lotsOfWins, fewWins); +const mainQuery = Parse.Query.or(lotsOfWins, fewWins); mainQuery.find() .then(function(results) { // results contains a list of players that either have won a lot of games or won only a few games. @@ -388,7 +388,7 @@ mainQuery.find() If you want to find objects that match all conditions, you normally would use just one query. You can add additional constraints to the newly created `Parse.Query` that act as an 'and' operator. ```javascript -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.greaterThan("age", 18); query.greaterThan("friends", 0); query.find() @@ -403,19 +403,19 @@ query.find() Sometimes the world is more complex than this simple example and you may need a compound query of sub queries. You can use `Parse.Query.and` method to construct a query that is an AND of the queries passed in. For instance if you want to find users in the age of 16 or 18 who have either no friends or at least 2 friends, you can do: ```javascript -var age16Query = new Parse.Query("User"); +const age16Query = new Parse.Query("User"); age16Query.equalTo("age", 16); -var age18Query = new Parse.Query("User"); +const age18Query = new Parse.Query("User"); age18Query.equalTo("age", 18); -var friends0Query = new Parse.Query("User"); +const friends0Query = new Parse.Query("User"); friends0Query.equalTo("friends", 0); -var friends2Query = new Parse.Query("User"); +const friends2Query = new Parse.Query("User"); friends2Query.greaterThan("friends", 2); -var mainQuery = Parse.Query.and( +const mainQuery = Parse.Query.and( Parse.Query.or(age16Query, age18Query), Parse.Query.or(friends0Query, friends2Query) ); @@ -443,11 +443,11 @@ You can create a pipeline using an Array or an Object. The following example is a pipeline similar to `distinct` grouping by name field. ```javascript -var pipelineObject = { +const pipelineObject = { group: { objectId: '$name' } }; -var pipelineArray = [ +const pipelineArray = [ { group: { objectId: '$name' } } ]; ``` @@ -462,10 +462,10 @@ You can group by a field. ```javascript // score is the field. $ before score lets the database know this is a field -var pipeline = [ +const pipeline = [ { group: { objectId: '$score' } } ]; -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.aggregate(pipeline) .then(function(results) { // results contains unique score values @@ -479,10 +479,10 @@ You can apply collective calculations like $sum, $avg, $max, $min. ```javascript // total will be a newly created field to hold the sum of score field -var pipeline = [ +const pipeline = [ { group: { objectId: null, total: { $sum: '$score' } } } ]; -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.aggregate(pipeline) .then(function(results) { // results contains sum of score field and stores it in results[0].total @@ -495,10 +495,10 @@ query.aggregate(pipeline) Project pipeline is similar to `keys` or `select`, add or remove existing fields. ```javascript -var pipeline = [ +const pipeline = [ { project: { name: 1 } } ]; -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.aggregate(pipeline) .then(function(results) { // results contains only name field @@ -511,10 +511,10 @@ query.aggregate(pipeline) Match pipeline is similar to `equalTo`. ```javascript -var pipeline = [ +const pipeline = [ { match: { name: 'BBQ' } } ]; -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.aggregate(pipeline) .then(function(results) { // results contains name that matches 'BBQ' @@ -527,10 +527,10 @@ query.aggregate(pipeline) You can match by comparison. ```javascript -var pipeline = [ +const pipeline = [ { match: { score: { $gt: 15 } } } ]; -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.aggregate(pipeline) .then(function(results) { // results contains score greater than 15 @@ -548,7 +548,7 @@ Queries can be made using distinct, allowing you find unique values for a specif * `MasterKey` is required. ```javascript -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.distinct("age") .then(function(results) { // results contains unique age @@ -561,7 +561,7 @@ query.distinct("age") You can also restrict results by using `equalTo`. ```javascript -var query = new Parse.Query("User"); +const query = new Parse.Query("User"); query.equalTo("name", "foo"); query.distinct("age") .then(function(results) { diff --git a/_includes/js/roles.md b/_includes/js/roles.md index a96e0c36e..e5c4e065c 100644 --- a/_includes/js/roles.md +++ b/_includes/js/roles.md @@ -22,16 +22,16 @@ To create a new `Parse.Role`, you would write: ```javascript // By specifying no write privileges for the ACL, we can ensure the role cannot be altered. -var roleACL = new Parse.ACL(); +const roleACL = new Parse.ACL(); roleACL.setPublicReadAccess(true); -var role = new Parse.Role("Administrator", roleACL); +const role = new Parse.Role("Administrator", roleACL); role.save(); ``` You can add users and roles that should inherit your new role's permissions through the "users" and "roles" relations on `Parse.Role`: ```javascript -var role = new Parse.Role(roleName, roleACL); +const role = new Parse.Role(roleName, roleACL); role.getUsers().add(usersToAddToRole); role.getRoles().add(rolesToAddToRole); role.save(); @@ -46,9 +46,9 @@ Now that you have created a set of roles for use in your application, you can us Giving a role read or write permission to an object is straightforward. You can either use the `Parse.Role`: ```javascript -var moderators = /* Query for some Parse.Role */; -var wallPost = new Parse.Object("WallPost"); -var postACL = new Parse.ACL(); +const moderators = /* Query for some Parse.Role */; +const wallPost = new Parse.Object("WallPost"); +const postACL = new Parse.ACL(); postACL.setRoleWriteAccess(moderators, true); wallPost.setACL(postACL); wallPost.save(); @@ -57,8 +57,8 @@ wallPost.save(); You can avoid querying for a role by specifying its name for the ACL: ```javascript -var wallPost = new Parse.Object("WallPost"); -var postACL = new Parse.ACL(); +const wallPost = new Parse.Object("WallPost"); +const postACL = new Parse.ACL(); postACL.setRoleWriteAccess("Moderators", true); wallPost.setACL(postACL); wallPost.save(); @@ -71,8 +71,8 @@ As described above, one role can contain another, establishing a parent-child re These types of relationships are commonly found in applications with user-managed content, such as forums. Some small subset of users are "Administrators", with the highest level of access to tweaking the application's settings, creating new forums, setting global messages, and so on. Another set of users are "Moderators", who are responsible for ensuring that the content created by users remains appropriate. Any user with Administrator privileges should also be granted the permissions of any Moderator. To establish this relationship, you would make your "Administrators" role a child role of "Moderators", like this: ```javascript -var administrators = /* Your "Administrators" role */; -var moderators = /* Your "Moderators" role */; +const administrators = /* Your "Administrators" role */; +const moderators = /* Your "Moderators" role */; moderators.getRoles().add(administrators); moderators.save(); ``` diff --git a/_includes/js/users.md b/_includes/js/users.md index 8c64f55bd..533212622 100644 --- a/_includes/js/users.md +++ b/_includes/js/users.md @@ -21,7 +21,7 @@ We'll go through each of these in detail as we run through the various use cases The first thing your app will do is probably ask the user to sign up. The following code illustrates a typical sign up: ```javascript -var user = new Parse.User(); +const user = new Parse.User(); user.set("username", "my name"); user.set("password", "my pass"); user.set("email", "email@example.com"); @@ -82,7 +82,7 @@ Please note that this functionality is disabled by default on Node.js environmen Whenever you use any signup or login methods, the user is cached in localStorage, or in any storage you configured via the `Parse.setAsyncStorage` method. You can treat this cache as a session, and automatically assume the user is logged in: ```javascript -var currentUser = Parse.User.current(); +const currentUser = Parse.User.current(); if (currentUser) { // do stuff with the user } else { @@ -102,7 +102,7 @@ You can clear the current user by logging them out: ```javascript Parse.User.logOut().then(() => { - var currentUser = Parse.User.current(); // this will now be null + const currentUser = Parse.User.current(); // this will now be null }); ``` @@ -168,8 +168,8 @@ The same security model that applies to the `Parse.User` can be applied to other The simplest way to use a `Parse.ACL` is to specify that an object may only be read or written by a single user. This is done by initializing a Parse.ACL with a `Parse.User`: `new Parse.ACL(user)` generates a `Parse.ACL` that limits access to that user. An object's ACL is updated when the object is saved, like any other property. Thus, to create a private note that can only be accessed by the current user: ```javascript -var Note = Parse.Object.extend("Note"); -var privateNote = new Note(); +const Note = Parse.Object.extend("Note"); +const privateNote = new Note(); privateNote.set("content", "This note is private!"); privateNote.setACL(new Parse.ACL(Parse.User.current())); privateNote.save(); @@ -180,12 +180,12 @@ This note will then only be accessible to the current user, although it will be Permissions can also be granted on a per-user basis. You can add permissions individually to a `Parse.ACL` using `setReadAccess` and `setWriteAccess`. For example, let's say you have a message that will be sent to a group of several users, where each of them have the rights to read and delete that message: ```javascript -var Message = Parse.Object.extend("Message"); -var groupMessage = new Message(); -var groupACL = new Parse.ACL(); +const Message = Parse.Object.extend("Message"); +const groupMessage = new Message(); +const groupACL = new Parse.ACL(); // userList is an array with the users we are sending this message to. -for (var i = 0; i < userList.length; i++) { +for (let i = 0; i < userList.length; i++) { groupACL.setReadAccess(userList[i], true); groupACL.setWriteAccess(userList[i], true); } @@ -197,8 +197,8 @@ groupMessage.save(); You can also grant permissions to all users at once using `setPublicReadAccess` and `setPublicWriteAccess`. This allows patterns like posting comments on a message board. For example, to create a post that can only be edited by its author, but can be read by anyone: ```javascript -var publicPost = new Post(); -var postACL = new Parse.ACL(Parse.User.current()); +const publicPost = new Post(); +const postACL = new Parse.ACL(Parse.User.current()); postACL.setPublicReadAccess(true); publicPost.setACL(postACL); publicPost.save(); @@ -248,11 +248,11 @@ const women = await query.find(); Associations involving a `Parse.User` work right of the box. For example, let's say you're making a blogging app. To store a new post for a user and retrieve all their posts: ```javascript -var user = Parse.User.current(); +const user = Parse.User.current(); // Make a new post -var Post = Parse.Object.extend("Post"); -var post = new Post(); +const Post = Parse.Object.extend("Post"); +const post = new Post(); post.set("title", "My New Post"); post.set("body", "This is some great content."); post.set("user", user); @@ -389,7 +389,7 @@ Our library manages the `FB` object for you. The `FB` singleton is synchronized Parse allows you to link your users with [3rd party authentication]({{ site.baseUrl }}/parse-server/guide/#oauth-and-3rd-party-authentication), enabling your users to sign up or log into your application using their existing identities. This is accomplished through [`linkWith`](https://parseplatform.org/Parse-SDK-JS/api/2.9.0/Parse.User.html#linkWith) method by providing authentication data for the service you wish to link to a user in the `authData` field. Once your user is associated with a service, the `authData` for the service will be stored with the user and is retrievable by logging in. -`authData` is a JSON object with keys for each linked service containing the data below. +`authData` is a JSON object with keys for each linked service containing the data below. The `authData` object is required to at least have a key named `id`, which is used to identify the user on subsequent login attempts with linked account data. > `_linkWith` has been deprecated since version 2.9.0, see [_linkWith](https://parseplatform.org/Parse-SDK-JS/api/master/Parse.User.html#_linkWith) @@ -399,7 +399,7 @@ Signing a user up with a linked service and logging them in with that service us ```javascript const myAuthData = { - id: '12345678' + id: '12345678' // Required field. Used to uniquely identify the linked account. }; const user = new Parse.User(); await user.linkWith('providerName', { authData: myAuthData }); @@ -414,11 +414,11 @@ Location: https://YOUR.PARSE-SERVER.HERE/parse/users/uMz0YZeAqc With a response body like: -```json +```jsonc { "username": "Parse", - "createdAt": "2012-02-28T23:49:36.353Z", - "updatedAt": "2012-02-28T23:49:36.353Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "uMz0YZeAqc", "sessionToken": "r:samplei3l83eerhnln0ecxgy5", "authData": { @@ -436,10 +436,10 @@ Location: https://YOUR.PARSE-SERVER.HERE/parse/users/uMz0YZeAqc ``` The body of the response will contain the `objectId`, `createdAt`, `sessionToken`, and an automatically-generated unique `username`. For example: -```json +```jsonc { "username": "iwz8sna7sug28v4eyu7t89fij", - "createdAt": "2012-02-28T23:49:36.353Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "uMz0YZeAqc", "sessionToken": "r:samplei3l83eerhnln0ecxgy5" } @@ -450,7 +450,7 @@ To create a link to an un-authenticated user (for example in cloud code), option ```javascript const myAuthData = { - id: xzx5tt123, + id: xzx5tt123, // The id key is required in the authData-object. Otherwise Parse Server will throw the Error 252 'This authentication method is unsupported'. access: token } @@ -473,14 +473,15 @@ const loggedIn = await Parse.User.logInWith('CustomAdapter', { authData: myAuthD ### Custom Authentication Module Parse Server supports many [3rd Party Authenications]({{ site.baseUrl }}/parse-server/guide/#oauth-and-3rd-party-authentication). -It is possible to `linkWith` any 3rd Party Authentication by creating a custom authentication module. - -[Read more about Auth Provider Documentation](https://github.com/parse-community/Parse-SDK-JS/blob/master/src/interfaces/AuthProvider.js) +It is possible to `linkWith` any 3rd Party Authentication by creating a custom authentication module. A custom authentication module normally consists of a client-side AuthProvider object and a back-end AuthAdapter. The client-side object should implement the [AuthProvider interface](https://github.com/parse-community/Parse-SDK-JS/blob/master/src/interfaces/AuthProvider.js). The backend AuthAdapter should implement the the functions `validateAuthData` and `validateAppId`, check out this [AuthAdapter example](https://github.com/parse-community/parse-server/blob/master/src/Adapters/Auth/AuthAdapter.js). +When calling the `linkWith` function **without** an `authData` object the client side authenticate-method from the provider object will be called. In the other case the `authData` object will be sent directly to Parse Server for authentication using the backend module. -Note: This is an example, you can handle your own authentication (if you don't have authData), restoreAuthentication and deauthenticate methods. +Note: The following is a minimal example implementing AuthProvider client-side and AuthAdapter on the backend. -A minimal `CustomAuth.js` module: +A minimal `CustomAuth.js` module in the backend: ```javascript +// Don't require or import parse-server in this module. +// See this issue: https://github.com/parse-community/parse-server/issues/6467 function validateAuthData(authData, options) { return Promise.resolve({}) } @@ -517,7 +518,15 @@ app.use('/parse', api); Use the `CustomAuth`: ```javascript const provider = { - authenticate: () => Promise.resolve(), + authenticate: (options) => { + // Some code to get retrieve authData + // If retrieved valid authData, call success function with the data + options.success(this, { + id: 1234 + }); + // You can also handle error + // options.error(this, {}); + }, restoreAuthentication() { return true; }, diff --git a/_includes/parse-server/Files-Migration.md b/_includes/parse-server/Files-Migration.md deleted file mode 100644 index bf8141753..000000000 --- a/_includes/parse-server/Files-Migration.md +++ /dev/null @@ -1,22 +0,0 @@ -In order of priority and easiest to hardest, here's how we should allow files migration from Hosted Parse to Parse Server: - -### In Flight - -Parse Server knows how to access and read existing files in Hosted Parse S3. We should make so that whenever we have a request for a file still on Hosted Parse, Parse Server downloads the original, uploads it to your file store and updates the reference in Mongo. This should probably be an option, maybe not everyone wants to allow this? - -* Pros: Easy to implement, seamless for users -* Cons: Small latency hit the first time we copy the file (although we could just redirect and defer the download), could potentially miss some never accessed files, how to deal with concurrency? - -### Mongo Objects - -Have a helper script in Parse Server that looks up the Schema places with known file objects, iterates over all those object and copies them to the new data store using the file adapter. - -* Pros: guaranties that all referenced files are copied, would allow you to migrate from one file adapter to another -* Cons: can be costly and take a long time to iterate on all Mongo objects for large apps, what to do for file objects within objects/arrays? - -### S3 Listing - -We could have an API on Hosted Parse that once authenticated, returns the list of all the files an app has in S3 by doing a listing on the bucket. - -* Pros: users control how they want to sync their files, ability to download all files even those deleted in Mongo -* Cons: need to implement some API on Hosted Parse for security, listing job can take a long time for apps with lots of files \ No newline at end of file diff --git a/_includes/parse-server/MongoRocks.md b/_includes/parse-server/MongoRocks.md deleted file mode 100644 index 873e3328e..000000000 --- a/_includes/parse-server/MongoRocks.md +++ /dev/null @@ -1,201 +0,0 @@ -# Using MongoDB + RocksDB - -## MongoRocks: What and Why? - -**Quick Version** - -Parse has been using MongoDB on RocksDB (MongoRocks) for application data since [April, 2015](http://blog.parse.com/announcements/mongodb-rocksdb-parse/). If you are migrating your Parse app(s) to your own MongoDB infrastructure, we recommend using MongoRocks to take advantage of the increased performance, greater efficiency, and powerful backup capabilities offered by the RocksDB storage engine. - -**Long Version** - -In version 3.0, MongoDB introduced the storage engine API to allow users an alternative to the default memory mapped (MMAP) storage engine used by earlier versions of MongoDB. In 2015, Facebook developed a RocksDB implementation of the storage engine API, MongoRocks, which is used by Parse for all customer data. RocksDB is an embeddable persistent key-value store developed by Facebook. It uses a [Log-structured Merge Tree](https://en.wikipedia.org/wiki/Log-structured_merge-tree) (LSM) for storage and is designed for high write throughput and storage efficiency. - -### Improved Performance and Efficiency - -When Parse switched from MMAP to MongoRocks, we discovered the following benefits in our [benchmarking](http://blog.parse.com/learn/engineering/mongodb-rocksdb-writing-so-fast-it-makes-your-head-spin/): - -- 50x increase in write performance -- 90% reduction in storage size -- significantly reduced latency on concurrent workloads due to reduced lock contention - -### Simple and efficient hot backups - -In addition to performance gains, a major advantage of MongoRocks (and RocksDB in general) is very efficient backups that do not require downtime. As detailed in this [blog post](http://blog.parse.com/learn/engineering/strata-open-source-library-for-efficient-mongodb-backups/), RocksDB backups can be taken on a live DB without interrupting service. RocksDB also supports incremental backups, reducing the I/O, network, and storage costs of doing backups and allowing backups to run more frequently. At Parse, we reduced DB infrastructure costs by more than 20% by using MongoRocks, the Strata backup tool, and Amazon S3 in place of MMAP and EBS Snapshots. - -### Are there any reasons not to use MongoRocks? - -Generally speaking, MongoRocks was suitable for running all app workloads at Parse. However, there are some workloads for which LSM are not ideal, and for which better performance may be achieved with other storage engines like MMAP or WiredTiger, such as: - -- Applications with high number of in-place updates or deletes. For example, a very busy work queue or heap. -- Applications with queries that scan many documents *and* fit entirely in memory. - -It's difficult to make precise statements about performance for any given workload without data. When in doubt, run your own benchmarks. You can use the [flashback](https://github.com/parseplatform/flashback) toolset to record and replay benchmarks based on live traffic. - -## Example: Provisioning on Ubuntu and AWS - -There are hundreds of ways to build out your infrastructure. For illustration we use an AWS and Ubuntu configuration similar to that used by Parse. You will need a set of AWS access keys and the AWS CLI. - -### Choosing Hardware - -At Parse, we use AWS i2.* (i/o optimized) class instances with ephemeral storage for running MongoRocks. Prior to this, when we used the MMAP storage engine, we used r3.* (memory optimized) instances with EBS PIOPS storage. Why the change? - -- RocksDB is designed to take full advantage of SSD storage. We also experienced large bursts of I/O for some workloads, and provisioning enough IOPS with EBS to support this was expensive. The ephemeral SSDs provided by the i2 class were ideal in our case. -- MongoRocks uses significantly more CPU than MMAP due to compression. CPU was never a major factor in MMAP. -- Memory is less critical in MongoRocks. Memory is everything in MMAP. -- EBS snapshots were critical to our backup strategy with MMAP. With MongoRocks, we had incremental backups with strata, so snapshots were not needed. - -If you're not sure about your workload requirements, we recommend running on the i2 class instances. You can always change this later depending on your production experience. - -Below is a general guide for instance sizing based on your existing Parse request traffic: - -- < 100 requests/sec: i2.xlarge -- 100-500 requests/sec: i2.2xlarge -- 500+ requests/sec: i2.4xlarge - -This guide will use i2.2xlarge as an example. - -### Provisioning - -We recommend you run MongoDB in replica set mode, with at least three nodes for availablity. Each node should run in a separate Availability Zone. - -There are dozens of ways to provision hosts in AWS. For reference, we use the AWS CLI below, but the inputs can be easily translated to your tool of choice. - -```sh -$ SECURITY_GROUP= -$ US_EAST_1A_SUBNET= -$ US_EAST_1C_SUBNET= -$ US_EAST_1D_SUBNET= -$ aws ec2 run-instances —image-id ami-fce3c696 --instance-type i2.2xlarge --key-name chef3 --block-device-mappings '[{"DeviceName": "/dev/sdb", "VirtualName": "ephemeral0"},{"DeviceName": "/dev/sdc", "VirtualName": "ephemeral1"}]' --security-group-ids ${SECURITY_GROUP} --subnet-id ${US_EAST_1A_SUBNET} --associate-public-ip-address -$ aws ec2 run-instances —image-id ami-fce3c696 --instance-type i2.2xlarge --key-name chef3 --block-device-mappings '[{"DeviceName": "/dev/sdb", "VirtualName": "ephemeral0"},{"DeviceName": "/dev/sdc", "VirtualName": "ephemeral1"}]' --security-group-ids ${SECURITY_GROUP} --subnet-id ${US_EAST_1D_SUBNET} --associate-public-ip-address -$ aws ec2 run-instances —image-id ami-fce3c696 --instance-type i2.2xlarge --key-name chef3 --block-device-mappings '[{"DeviceName": "/dev/sdb", "VirtualName": "ephemeral0"},{"DeviceName": "/dev/sdc", "VirtualName": "ephemeral1"}]' --security-group-ids ${SECURITY_GROUP} --subnet-id ${US_EAST_1D_SUBNET} --associate-public-ip-address -``` - -### Configuring Storage - -The i2.2xlarge and larger instances have multiple ephemeral volumes that should be striped together to produce your data volume. On each host, use **mdadm** to create the raid volume: - -```sh -$ sudo apt-get install mdadm -$ sudo mdadm —create /dev/md0 --level=stripe /dev/xvdb /dev/xvdc -$ sudo mkfs -t ext4 /dev/md0 -$ sudo mkdir -p /var/lib/mongodb -$ sudo mount /dev/md0 /var/lib/mongodb -``` - -## Installing MongoRocks - -To use MongoRocks, you will need to use a special build of MongoDB that has the storage engine compiled in. At Parse, we run an internally built version, as a pre-packaged version of MongoRocks did not exist when we initially migrated. For new installations, we recommend that you use the Percona builds located [here](https://www.percona.com/downloads/percona-server-mongodb/LATEST/). These builds are 100% feature compatible with the official MongoDB releases, but have been compiled to include the RocksDB storage engine. We have tested the Percona builds with the Parse migration utility and the strata backup software, and verified that both work and are suitable for running Parse apps in production. - -### Ubuntu installation - -```sh -$ curl -s -O https://www.percona.com/downloads/percona-server-mongodb/percona-server-mongodb-3.0.8-1.2/binary/debian/trusty/x86_64/percona-server-mongodb-3.0.8-1.2-r97f91ef-trusty-x86_64-bundle.tar -$ tar -xf percona-server-mongodb-3.0.8-1.2-r97f91ef-trusty-x86_64-bundle.tar -$ sudo dpkg -i percona-server-mongodb-* -``` - -### Configuration - -Configuring MongoDB to use the RocksDB storage engine is a matter of setting a few flags in the mongodb.conf file. For complete documentation of all MongoDB configuration options, visit the MongoDB reference page for [Configuration File Options](https://docs.mongodb.com/v3.0/reference/configuration-options/). - -First, set the storage engine parameter to instruct MongoDB to use the RocksDB storage engine. - -``` -storage: - dbPath: /var/lib/mongodb - journal: - enabled: true - engine: rocksdb -``` - -Next, some additional parameters. - -``` -# RockDB tuning parameters -# Yield if it's been at least this many milliseconds since we last yielded. -setParameter = internalQueryExecYieldPeriodMS=1000 -# Yield after this many "should yield?" checks. -setParameter = internalQueryExecYieldIterations=100000 -``` - -The adjustments to the internalQueryExecYield\* options reduce the frequency that MongoDB yields for writers. Since RocksDB has document level locking, frequent yielding is not necessary. - -### Startup - -When starting MongoRocks on a host for the very first time, your storage directory (e.g. /var/lib/mongodb) should be empty. If you have existing data from other storage engines (i.e. MMAP or WiredTiger), you should back up and remove those data files, as the storage formats are not compatible. - -## Backups - -### Installing strata - -Strata is written in go. It requires go 1.4 or later to compile. You can use apt or yum to install go, but these packages are frequently out of date on common distributions. To install a more recent version of go: - -```sh -$ curl https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz | sudo tar xzf - -C /usr/local -$ sudo mkdir /go -$ sudo chmod 0777 /go -``` - -You will need to add go to your *PATH* environment variable and set GOPATH. On ubuntu, this is as simple as: - -```sh -$ echo -e 'export PATH="/usr/local/go/bin:${PATH}:" \nexport GOPATH=/go' | sudo tee /etc/profile.d/gopath.sh -``` - -After logging in again, you can test that go is installed by running - -```sh -$ go version -go version go1.5.3 linux/amd64 -``` - -### Installing strata - -With go installed, compiling and installing strata is simply a matter of using `go install`: - -```sh -$ go get github.com/facebookgo/rocks-strata/strata/cmd/mongo/lreplica_s3storage_driver/strata -$ go install github.com/facebookgo/rocks-strata/strata/cmd/mongo/lreplica_s3storage_driver/strata -``` - -This installs the strata binary to `$GOPATH/bin/strata` - -### Configuring backups - -At Parse, we deployed strata using a simple distributed cron on all backup nodes. You can find a sample cron and and schedule [here](https://github.com/facebookgo/rocks-strata/blob/master/examples/backup/run.sh) in the rocks-strata repository. - -At a high level, the three things you want to do regularly when running backups with strata are: - -1. Run `strata backup` to create the actual backup. This stores the data files and backup metadata in S3, identified by a unique replica ID. Each host must have its own replica ID. For example, if your RS is named "mydata" and your host name is "db1", you might use "mydata-db1" as your replica ID. -2. Run `strata delete` to prune metadata for backups older than a certain date. The retention period that you specify is dependent on your needs. -3. Run `strata gc` to delete data files that are orphaned by `strata delete`. - -### Displaying backups - -You can view backup metadata at any time with `strata show backups`: - -For example, to see all backups for node *db1* in replica set *mydb*, you would run something like this: - -```sh -$ strata --bucket=mybucket --bucket-prefix=mongo-rocks show backups --replica-id=mydb-db1 - -ID data num files size (GB) incremental files incremental size duration -0 2015-09-02 21:11:20 UTC 4 0.000005 4 0.000005 187.929573ms -``` - -More documentation on strata, including how to restore backups, can be found [here](https://github.com/facebookgo/rocks-strata). - -## Migrating Existing Data to MongoRocks - -### Upgrading an existing replica set to MongoRocks - -The data files used by MMAP, WiredTiger, and RocksDB are not compatible. In other words, you cannot start MongoRocks using existing MMAP or Wiredtiger data. To change storage formats, you must do one of the following: - -1. Do a logical export and import using [mongodump](https://docs.mongodb.com/v3.0/reference/program/mongodump/) and [mongorestore](https://docs.mongodb.com/manual/reference/program/mongorestore/). -2. Perform an initial sync of data using replication - -Option 2 is the easiest, as you can bring a new, empty node online and add it to the replica set without incurring downtime. This approach usually works fine until your data size is in the hundreds of gigabytes. To do so: - -1. Provision a new node configured for RocksDB, following the above steps. -2. Add the node to your replica set using [rs.add()](https://docs.mongodb.com/v3.0/reference/method/rs.add/) -3. Wait for initial sync. Note that your data sync must complete before the oplog window expires. Depending on the size of your data, you may need to [resize your oplog](https://docs.mongodb.com/v3.0/tutorial/change-oplog-size/) diff --git a/_includes/parse-server/ParsePlatform.md b/_includes/parse-server/ParsePlatform.md deleted file mode 100644 index e7411aa68..000000000 --- a/_includes/parse-server/ParsePlatform.md +++ /dev/null @@ -1,37 +0,0 @@ -# Using MongoDB + RocksDB - -### Provisioning - -We recommend you run MongoDB in replica set mode, with at least three nodes for availablity. Each node should run in a separate Availability Zone. - -### Configuring Storage - - - Formatting data volumes with the XFS filesystem is strongly recommended. - -### Configuration - -#### MongoDB 3.0 - -Configuring MongoDB to use the WireTiger storage engine is a matter of setting a few flags in the mongodb.conf file. For complete documentation of all MongoDB configuration options, visit the MongoDB reference page for [Configuration File Options](https://docs.mongodb.com/v3.0/reference/configuration-options/). - -First, set the storage engine parameter to instruct MongoDB to use the WiredTiger storage engine. - -``` -storage: - dbPath: /var/lib/mongodb - journal: - enabled: true - engine: wiredTiger -``` - -### Startup - -When starting MongoDB with WiredTiger on a host for the very first time, your storage directory (e.g. /var/lib/mongodb) should be empty. If you have existing data from other storage engines (i.e. MMAP or MongoRocks), you should back up and remove those data files, as the storage formats are not compatible. - -## Backups - -If taking snapshots ensure that the journal lives on the same volume as the data files for WiredTiger. - -From the MongoDB Manual: - - > Snapshotting with the journal is only possible if the journal resides on the same volume as the data files, so that one snapshot operation captures the journal state and data file state atomically. diff --git a/_includes/parse-server/best-practice.md b/_includes/parse-server/best-practice.md new file mode 100644 index 000000000..cef440461 --- /dev/null +++ b/_includes/parse-server/best-practice.md @@ -0,0 +1,23 @@ +# Best Practice + +*This page is a work in progress and incomplete. If you have any suggestions, please open a pull request.* + +## Security + +### Firewall + +Protect all Parse Server endpoints using a Firewall to mitigate the risk of malicious attempts to scape user data, flood the database and DDoS attacks. +- Use rate-limiting rules for public endpoints, for example limit the number of requests per IP address or per user. +- Use very restrictive rules for private endpoints; for example limit access to Parse Dashboard to your personal network. + +## Optimization + +The following is a list of design considerations to optimize data traffic and performance. + +### Database + +- Use short field names; field names need to be stored in the database just like the field values; short field names not only require less database storage but also reduce the data traffic between database, server and client. + +### Queries + +- Use `select` and `exclude` to transfer only the fields that you need instead of the whole object. \ No newline at end of file diff --git a/_includes/parse-server/compatibility.md b/_includes/parse-server/compatibility.md deleted file mode 100644 index 99f494895..000000000 --- a/_includes/parse-server/compatibility.md +++ /dev/null @@ -1,258 +0,0 @@ -# Compatibility with parse.com - -There are a few areas where Parse Server does not provide compatibility with the original Parse.com hosted backend. - -## Analytics - -Parse Analytics is not supported. We recommend sending analytics to another similar service like Mixpanel or Google Analytics. - -## Authentication - -By default, only an application ID is needed to authenticate with Parse Server. The base configuration that comes with the one-click deploy options does not require authenticating with any other types of keys. Therefore, specifying client keys on Android or iOS is not needed. - -## Client Class Creation - -Hosted Parse applications can turn off client class creation in their settings. Client Class Creation can be disabled by a configuration flag on parse-server. - -## Cloud Code - -You will likely need to make several changes to your Cloud Code to port it to Parse Server. - -### No current user - -Each Cloud Code request is now handled by the same instance of Parse Server, therefore there is no longer a concept of a "current user" constrained to each Cloud Code request. If your code uses `Parse.User.current()`, you should use `request.user` instead. If your Cloud function relies on queries and other operations being performed within the scope of the user making the Cloud Code request, you will need to pass the user's `sessionToken` as a parameter to the operation in question. - -Consider an messaging app where every `Message` object is set up with an ACL that only provides read-access to a limited set of users, say the author of the message and the recipient. To get all the messages sent to the current user you may have a Cloud function similar to this one: - -```js -// Parse.com Cloud Code -Parse.Cloud.define('getMessagesForUser', function(request, response) { - var user = Parse.User.current(); - - var query = new Parse.Query('Messages'); - query.equalTo('recipient', user); - query.find() - .then(function(messages) { - response.success(messages); - }); -}); -``` - -If this function is ported over to Parse Server without any modifications, you will first notice that your function is failing to run because `Parse.User.current()` is not recognized. If you replace `Parse.User.current()` with `request.user`, the function will run successfully but you may still find that it is not returning any messages at all. That is because `query.find()` is no longer running within the scope of `request.user` and therefore it will only return publicly-readable objects. - -To make queries and writes as a specific user within Cloud Code, you need to pass the user's `sessionToken` as an option. The session token for the authenticated user making the request is available in `request.user.getSessionToken()`. - -The ported Cloud function would now look like this: - -```js -// Parse Server Cloud Code -Parse.Cloud.define('getMessagesForUser', function(request, response) { - var user = request.user; // request.user replaces Parse.User.current() - var token = user.getSessionToken(); // get session token from request.user - - var query = new Parse.Query('Messages'); - query.equalTo('recipient', user); - query.find({ sessionToken: token }) // pass the session token to find() - .then(function(messages) { - response.success(messages); - }); -}); -``` - -### Master key must be passed explicitly - -`Parse.Cloud.useMasterKey()` is not available in Parse Server Cloud Code. Instead, pass `useMasterKey: true` as an option to any operation that requires the use of the master key to bypass ACLs and/or CLPs. - -Consider you want to write a Cloud function that returns the total count of messages sent by all of your users. Since the objects in our `Message` class are using ACLs to restrict read access, you will need to use the master key to get the total count: - -```js -Parse.Cloud.define('getTotalMessageCount', function(request, response) { - - // Parse.Cloud.useMasterKey() <-- no longer available! - - var query = new Parse.Query('Messages'); - query.count({ useMasterKey: true }) // count() will use the master key to bypass ACLs - .then(function(count) { - response.success(count); - }); -}); -``` - -### Minimum JavaScript SDK version - -Parse Server also uses at least version [1.7.0](https://github.com/parse-community/Parse-SDK-JS/releases) of the Parse SDK, which has some breaking changes from the previous versions. If your Parse.com Cloud Code uses a previous version of the SDK, you may need to update your cloud code. You can look up which version of the JavaScript SDK your Parse.com Cloud Code is using by running the following command inside your Cloud Code folder: - -``` -$ parse jssdk -Current JavaScript SDK version is 1.7.0 -``` - -### Network requests - -As with Parse Cloud Code, you can use `Parse.Cloud.httpRequest` to make network requests on Parse Server. It's worth noting that in Parse Server you can use any npm module, therefore you may also install the ["request" module](https://www.npmjs.com/package/request) and use that directly instead. - -### Cloud Modules - -Native Cloud Code modules are not available in Parse Server, so you will need to use a replacement: - -* **App Links**: - Use the [applinks-metatag](https://github.com/parse-server-modules/applinks-metatag) module. - -* **Buffer**: - This is included natively with Node. Remove any `require('buffer')` calls. - -* **Mailgun**: - Use the official npm module: [mailgun-js](https://www.npmjs.com/package/mailgun-js). - -* **Mandrill**: - Use the official npm module, [mandrill-api](https://www.npmjs.com/package/mandrill-api). - -* **Moment**: - Use the official npm module, [moment](https://www.npmjs.com/package/moment). - -* **Parse Image**: - We recommend using another image manipulation library, like the [imagemagick wrapper module](https://www.npmjs.com/package/imagemagick). Alternatively, consider using a cloud-based image manipulation and management platform, such as [Cloudinary](https://www.npmjs.com/package/cloudinary). - -* **SendGrid**: - Use the official npm module, [sendgrid](https://www.npmjs.com/package/sendgrid). - -* **Stripe**: - Use the official npm module, [stripe](https://www.npmjs.com/package/stripe). - -* **Twilio**: - Use the official npm module, [twilio](https://www.npmjs.com/package/twilio). - -* **Underscore**: - Use the official npm module, [underscore](https://www.npmjs.com/package/underscore). - -## Dashboard - -Parse has provided a separate [Parse Dashboard project](http://blog.parse.com/announcements/introducing-the-parse-server-dashboard/) which can be used to manage all of your Parse Server applications. - -### Parse Config - -Parse Config is available in Parse Server and can be configured from your [Parse Dashboard](https://github.com/parse-community/parse-dashboard). - -### Push Notification Console - -You can now [send push notifications using Parse Dashboard](http://blog.parse.com/announcements/push-and-config-come-to-the-parse-dashboard/). - -## Storing Files - -Parse Files in hosted Parse applications were limited to 10 MB. The default storage layer in Parse Server, GridStore, can handle files up to 16 MB. To store larger files, we suggest using [Amazon's Simple Storage Service (S3)](#configuring-s3adapter). - -## In-App Purchases - -iOS in-app purchase verification through Parse is not supported. - -## Jobs - -There is no background job functionality in Parse Server. If you have scheduled jobs, port them over to a self-hosted solution using a wide variety of open source job queue projects. A popular one is [bull](https://github.com/OptimalBits/bull). Alternatively, if your jobs are simple, you could use a cron job. - -## Parse IoT Devices - -Push notification support for the Parse IoT SDKs is provided through the Parse Push Notification Service (PPNS). PPNS is a push notification service for Android and IoT devices maintained by Parse. This service will be retired on January 28, 2017. [This page](https://github.com/parse-community/parse-server/wiki/PPNS-Protocol-Specification) documents the PPNS protocol for users that wish to create their own PPNS-compatible server for use with their Parse IoT devices. - -## Push Notifications Compatibility - -### Client Push - -Hosted Parse applications could disable a security setting in order to allow clients to send push notifications. Parse Server does not allow clients to send push notifications as the `masterKey` must be used. Use Cloud Code or the REST API to send push notifications. - -## Schema - -Schema validation is built in. Retrieving the schema via API is available. - -## Session Features - -Parse Server requires the use of [revocable sessions](http://blog.parse.com/announcements/announcing-new-enhanced-sessions/). - -## Single app aware - -Parse Server only supports single app instances. There is ongoing work to make Parse Server multi-app aware. However, if you intend to run many different apps with different datastores, you currently would need to instantiate separate instances. - -## Social Login - -Facebook, Twitter, and Anonymous logins are supported out of the box. Support for additional platforms may be configured via the [`oauth` configuration option](#oauth-and-3rd-party-authentication). - -## Webhooks - -[Cloud Code Webhooks](http://blog.parse.com/announcements/introducing-cloud-code-webhooks/) are not supported. - -## Welcome Emails and Email Verification - -Verifying user email addresses and enabling password reset via email requires an email adapter. As part of the `parse-server` package we provide an adapter for sending email through Mailgun. To use it, sign up for Mailgun, and add this to your initialization code: - -```js -var server = ParseServer({ - ...otherOptions, - // Enable email verification - verifyUserEmails: true, - - // if `verifyUserEmails` is `true` and - // if `emailVerifyTokenValidityDuration` is `undefined` then - // email verify token never expires - // else - // email verify token expires after `emailVerifyTokenValidityDuration` - // - // `emailVerifyTokenValidityDuration` defaults to `undefined` - // - // email verify token below expires in 2 hours (= 2 * 60 * 60 == 7200 seconds) - emailVerifyTokenValidityDuration: 2 * 60 * 60, // in seconds (2 hours = 7200 seconds) - - // set preventLoginWithUnverifiedEmail to false to allow user to login without verifying their email - // set preventLoginWithUnverifiedEmail to true to prevent user from login if their email is not verified - preventLoginWithUnverifiedEmail: false, // defaults to false - - // The public URL of your app. - // This will appear in the link that is used to verify email addresses and reset passwords. - // Set the mount path as it is in serverURL - publicServerURL: 'https://example.com/parse', - // Your apps name. This will appear in the subject and body of the emails that are sent. - appName: 'Parse App', - // The email adapter - emailAdapter: { - module: '@parse/simple-mailgun-adapter', - options: { - // The address that your emails come from - fromAddress: 'parse@example.com', - // Your domain from mailgun.com - domain: 'example.com', - // Your API key from mailgun.com - apiKey: 'key-mykey', - } - }, - - // account lockout policy setting (OPTIONAL) - defaults to undefined - // if the account lockout policy is set and there are more than `threshold` number of failed login attempts then the `login` api call returns error code `Parse.Error.OBJECT_NOT_FOUND` with error message `Your account is locked due to multiple failed login attempts. Please try again after minute(s)`. After `duration` minutes of no login attempts, the application will allow the user to try login again. - accountLockout: { - duration: 5, // duration policy setting determines the number of minutes that a locked-out account remains locked out before automatically becoming unlocked. Set it to a value greater than 0 and less than 100000. - threshold: 3, // threshold policy setting determines the number of failed sign-in attempts that will cause a user account to be locked. Set it to an integer value greater than 0 and less than 1000. - }, - // optional settings to enforce password policies - passwordPolicy: { - // Two optional settings to enforce strong passwords. Either one or both can be specified. - // If both are specified, both checks must pass to accept the password - // 1. a RegExp object or a regex string representing the pattern to enforce - validatorPattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})/, // enforce password with at least 8 char with at least 1 lower case, 1 upper case and 1 digit - // 2. a callback function to be invoked to validate the password - validatorCallback: (password) => { return validatePassword(password) }, - doNotAllowUsername: true, // optional setting to disallow username in passwords - maxPasswordAge: 90, // optional setting in days for password expiry. Login fails if user does not reset the password within this period after signup/last reset. - maxPasswordHistory: 5, // optional setting to prevent reuse of previous n passwords. Maximum value that can be specified is 20. Not specifying it or specifying 0 will not enforce history. - //optional setting to set a validity duration for password reset links (in seconds) - resetTokenValidityDuration: 24*60*60, // expire after 24 hours - } -}); -``` - -You can also use other email adapters contributed by the community such as: -- [parse-server-postmark-adapter](https://www.npmjs.com/package/parse-server-postmark-adapter) -- [parse-server-sendgrid-adapter](https://www.npmjs.com/package/parse-server-sendgrid-adapter) -- [parse-server-mandrill-adapter](https://www.npmjs.com/package/parse-server-mandrill-adapter) -- [parse-server-simple-ses-adapter](https://www.npmjs.com/package/parse-server-simple-ses-adapter) -- [parse-server-mailgun-adapter-template](https://www.npmjs.com/package/parse-server-mailgun-adapter-template) -- [parse-server-sendinblue-adapter](https://www.npmjs.com/package/parse-server-sendinblue-adapter) -- [parse-server-mailjet-adapter](https://www.npmjs.com/package/parse-server-mailjet-adapter) -- [simple-parse-smtp-adapter](https://www.npmjs.com/package/simple-parse-smtp-adapter) -- [parse-server-generic-email-adapter](https://www.npmjs.com/package/parse-server-generic-email-adapter) diff --git a/_includes/parse-server/database.md b/_includes/parse-server/database.md index ccf72fe94..851a3a0eb 100644 --- a/_includes/parse-server/database.md +++ b/_includes/parse-server/database.md @@ -1,6 +1,6 @@ # Database -Parse Server let you use [MongoDB](https://www.mongodb.org/) or [Postgres](https://www.postgresql.org/) as a database. +Parse Server lets you use [MongoDB](https://www.mongodb.org/) or [Postgres](https://www.postgresql.org/) as a database. The prefered database is MongoDB but Postgres is a great option if you're starting a new project and you expect to have a stable Schema. @@ -8,32 +8,28 @@ The prefered database is MongoDB but Postgres is a great option if you're starti If you have not used MongoDB before, we highly recommend familiarizing yourself with it first before proceeding. -The Mongo requirements for Parse Server are: +If this is your first time setting up a MongoDB instance, we recommend a Database-as-a-Service (DBaaS) like [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) or [ObjectRocket](https://objectrocket.com/) which provide fully managed MongoDB instances and can help you scale as needed. -* MongoDB version 3.6 -* An SSL connection is recommended (but not required). - -If this is your first time setting up a production MongoDB instance, we recommend using either [mLab](http://www.mLab.com) or [ObjectRocket](https://objectrocket.com/). These are database-as-a-service companies which provide fully managed MongoDB instances, and can help you scale up as needed. +Ensure that the MongoDB version is compatible with your version of Parse Server, for details see the [compatibility table](https://github.com/parse-community/parse-server#compatibility) When using MongoDB with your Parse app, you need to manage your indexes yourself. You will also need to size up your database as your data grows. -If you are planning to run MongoDB on your own infrastructure, we highly recommend using the [RocksDB Storage Engine](#using-mongodb--rocksdb). - -In order to allow for better scaling of your data layer, it is possible to direct queries to a mongodb secondary for read operations. See: [Mongo Read Preference](#using-mongodb-read-preference). +In order to allow for better scaling of your data layer, it is possible to direct queries to a MongoDB secondary for read operations. See: [MongoDB Read Preference](#using-mongodb-read-preference). ## Postgres -The Postgres requirements for Parse Server are: +Ensure that the Postgres version is compatible with your version of Parse Server, for details see the [compatibility table](https://github.com/parse-community/parse-server#compatibility) -* Postgres version 9.5 -* PostGIS extensions 2.3 +[PostGIS](https://postgis.net) is required if you plan to use geographic or location features. -The postgres database adapter will be automatically loaded when you pass a valid postgres URL, for example: `postgres://localhost:5432`. The available configuration options through the URL are: +The Postgres database adapter will be automatically loaded when you pass a valid Postgres URL, for example: `postgres://localhost:5432`. The available configuration options through the URL are: ``` postgres://localhost:5432/db?ssl=boolean&rejectUnauthorized=boolean&ca=/path/to/file&pfx=/path/to/file&cert=/path/to/file&key=/path/to/file&passphrase=string&secureOptions=number&client_encoding=string&application_name=string&fallback_application_name=string&max=number&query_timeout=idleTimeoutMillis=number&poolSize=number&binary=boolean&keepAlive=boolean ``` +When using Postgres with your Parse app, you need to manage your indexes yourself. + Details about the configuration options can be found on [pg-promise](https://github.com/vitaly-t/pg-promise/wiki/Connection-Syntax). Some useful combinations are below: * SSL with verification - `postgres://localhost:5432/db?ca=/path/to/file` @@ -41,11 +37,11 @@ Details about the configuration options can be found on [pg-promise](https://git ### Caveats +* You will need to configure a [file adapter](#configuring-file-adapters) in order to store files. * Join tables are resolved in memory, there is no performance improvements using Postgres over MongoDB for relations or pointers. * Mutating the schema implies running ALTER TABLE, therefore we recommend you setup your schema when your tables are not full. -* Properly index your tables to maximize the performance. -* The postgres URL for 4.2.0 and below only supports the following configuration options: +* The Postgres URL for Parse Server 4.2.0 and below only supports the following configuration options: - ``` - postgres://localhost:5432/db?ssl=boolean&client_encoding=string&application_name=string&fallback_application_name=string&poolSize=number&binary=boolean&keepAlive=boolean - ``` +``` +postgres://localhost:5432/db?ssl=boolean&client_encoding=string&application_name=string&fallback_application_name=string&poolSize=number&binary=boolean&keepAlive=boolean +``` diff --git a/_includes/parse-server/deploying-aws-ubuntu.md b/_includes/parse-server/deploying-aws-ubuntu.md new file mode 100644 index 000000000..3e969d8db --- /dev/null +++ b/_includes/parse-server/deploying-aws-ubuntu.md @@ -0,0 +1,187 @@ +## Deploying on AWS EC2 Ubuntu using PostgreSQL + +Here are the steps: + +1. Log into your AWS account or create a new one [AWS Account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) +2. Go to AWS EC2 Dashboard +3. Launch Instances +4. On **Application and OS Images (Amazon Machine Image)** select `Ubuntu` +5. On **Instance Type** select `t2.micro` (is ok for testing and small projects which is Free tier eligible) +6. Create or select an existing `key pair`. (If you create a new one click `Download Key Pair`) +7. Click `Launch Instance` +8. On **EC2 Dashboard** select the new created instance and click `Security` +9. On **Security Groups**, click on the security group +10. On **Inbound Rules** tab, click `Edit Inbound Rules` +11. Click `Add rule` and select `PostgreSQL` from the dropdown menu and `Anywhere-IPv4`. +12. Click `Save rules` +13. On **EC2 Dashboard** select the new created instance and click `Connect` +14. Click `SSH Client` and follow the instructions + +Once logged into the ec2 instance we perform the following tasks: + +### Install Libraries and Dependencies +Update the local package manager `apt` +```bash +sudo apt update +``` +Install [NodeJS](https://nodejs.org) +```bash +sudo apt install nodejs +``` +Check the install was ok, you should see the version installed. +```bash +node -v +``` + + +Install [npm](https://www.npmjs.com) +```bash +sudo apt install npm +``` + + + +Install [yarn](https://yarnpkg.com) +```bash +sudo npm install yarn –g +``` + +### Install PostgreSQL Server + +Install [PostgreSQL](https://www.postgresql.org) +```bash +sudo apt-get -y install postgresql +``` +Once is installed, create a password for the user `postgres` + +```bash +sudo su postgres +``` + +```bash +psql +``` + +```bash +ALTER USER postgres password 'myStrongPassword'; +``` + +Quit psql typing `\q` + +Exit postgres user typing `exit` + +Navigate to main folder inside postgresql/version/ +```bash +cd /etc/postgresql/14/main/ +``` +We need to edit two files, `pg_hba.conf` and `postgresql.conf` +```bash +sudo nano pg_hba.conf +``` +Scroll down the file and Add `host, all, all, 0.0.0.0/0, md5`, has to be the first line before `local, all, postgres, , peer` + +| TYPE | DATABASE | USER | ADDRESS | METHOD | +| ---- | -------- | ---- | ------- | ------ | +| host | all | all | 0.0.0.0/0 | md5 | +| local | all | postgres | | peer | + + +```bash +sudo nano postgresql.conf +``` +Search for `#listen_addresses='localhost'`, uncomment the line and replace `localhost` for `*` + +Restart the PostgreSQL server +```bash +sudo service postgresql restart +``` + +### Setup Parse Server + +Create a directory +```bash +cd ~ +``` +```bash +mkdir parse-server +``` +```bash +cd parse-server +``` + +Run the bash script and follow the instructions, the script have some visual issues and the keys generation doesn't work. +```bash +sh <(curl -fsSL https://raw.githubusercontent.com/parse-community/parse-server/master/bootstrap.sh) +``` +After that, we need to setup the configuration file, use your own `appId`, `masterKey` and `clientKey`, use random strings or some generator tool to create secured keys. +```bash +sudo nano -w config.json +``` +This are the basic options of the config.json file, for the full list you can type `parse-server --help` or refer to the [full options document](https://parseplatform.org/parse-server/api/5.2.0/ParseServerOptions.html) for more details. +```jsonc +{ + "appId": "exampleAppId", + "masterKey": "exampleMasterKey", + "clientKey": "exampleClientKey", + "appName": "MyApp", + "cloud": "./cloud/main", + "databaseURI": "postgres://postgres:myStrongPassword@localhost:5432/postgres" +} +``` + + +Install Parse Server globally + +```bash +sudo npm install -g parse-server +``` + +Start Parse Server using the script command in the config.json +```bash +npm start +``` +or manually with the nohup command and specifying the configuration file, this option will keep the server running even if you close the terminal +```bash +nohup parse-server config.json & +``` +Check if Parse Server is running typing `http://:1337` in your browser's address bar, you should see `{"error":"unauthorized"}` + +### Setup Parse Dashboard + +Install Parse Dashboard globally +```bash +sudo npm install -g parse-dashboard +``` + +Once installed, you need to configure Parse Dashboard, go to `/usr/lib/node_modules/parse-dashboard/Parse-Dashboard/` and edit the file `parse-dashboard-config.json` +```bash +sudo nano -w parse-dashboard-config.json +``` +This is an example of parse-dashboard.config.json. +```jsonc +{ + "apps": [{ + "serverURL": "http://example.com:1337/parse", + "appId": "exampleAppId", + "masterKey": "exampleMasterKey", + "allowInsecureHTTP": "true", + "appName": "MyApp" + }], + "users": [{ + "user": "admin", + "pass": "password" + }] +} +``` + +Start Parse Dashboard +```bash +parse-dashboard +``` +or with the nohup command and specifying the configuration file, this option will keep the dashboard running even if you close the terminal +```bash +nohup parse-dashboard --dev --config parse-dashboard-config.json & +``` + +Check if Parse Dashboard is running typing `http://:4040` in your browser's address bar, you should see the login form, use the `user` and `pass` that you set in the `parse-dashboard-config.json` file. + diff --git a/_includes/parse-server/deploying-heroku-mlab.md b/_includes/parse-server/deploying-heroku-mlab.md index 8e4651df3..45edc7c7e 100644 --- a/_includes/parse-server/deploying-heroku-mlab.md +++ b/_includes/parse-server/deploying-heroku-mlab.md @@ -1,13 +1,20 @@ -## Deploying to Heroku and mLab +## Deploying to Heroku and MongoDB Atlas -Heroku and mLab provide an easy way to deploy Parse Server, especially if you're new to managing your own backend infrastructure. +Heroku and MongoDB Atlas provide an easy way to deploy Parse Server, especially if you're new to managing your own backend infrastructure. Here are the steps: 1. Create a repo for your Express app with the Parse Server middleware mounted (you can use our [sample project](https://github.com/parse-community/parse-server-example), or start your own). 2. Create a Heroku account (if you don’t have one already) and use the Heroku Toolbelt to log in and prepare a new app in the same directory as your Express app. Take a look at Heroku's [Getting Started with Node.js guide](https://devcenter.heroku.com/articles/getting-started-with-nodejs#introduction) for more details. -3. Use the mLab addon: `heroku addons:create mongolab:sandbox` (or, you can create a Mongo instance yourself, either directly with mLab or your own box) -4. Use heroku config and note the URI provided by mLab under the var MONGOLAB_URI +3. Set up your MongoDB database: + 1. Sign up for a [MongoDB Atlas account](https://www.mongodb.com/cloud/atlas). + 2. Create a `New Project`. + 3. Open the page `Database Access` and create a new database user with username and password. Remember these user credentials, you will need them later to connect Parse Server to the database. As user privileges choose `Read and write to any database`, you can change these privileges later on and make them more restrictive according to your needs. + 4. Open the page `Clusters` and create a new cluster. + 5. On the cluster details page, click on the tab `Collections` and create a new database. + 6. On the cluster details page, click on the tab `Command Line Tools`, click on `Connect Instructions` and choose `Connect your application`. + 7. Copy the database connection string. Replace the placeholders in the connection string with the username and password of the user you created earlier and the database name. +4. Use heroku config and note the URI provided by Atlas under the var MONGOLAB_URI 5. Copy this URI and set it as a new config variable: `heroku config:set DATABASE_URI=mongodb://...` 6. Deploy it: `git push heroku master` diff --git a/_includes/parse-server/deploying.md b/_includes/parse-server/deploying.md index b36f33761..4924106ce 100644 --- a/_includes/parse-server/deploying.md +++ b/_includes/parse-server/deploying.md @@ -7,3 +7,5 @@ The fastest and easiest way to start using Parse Server is to run MongoDB and Pa {% include_relative _includes/parse-server/deploying-glitch-mlab.md %} {% include_relative _includes/parse-server/deploying-back4app.md %} + +{% include_relative _includes/parse-server/deploying-aws-ubuntu.md %} \ No newline at end of file diff --git a/_includes/parse-server/file-adapters.md b/_includes/parse-server/file-adapters.md index 37d35ec91..2764efef0 100644 --- a/_includes/parse-server/file-adapters.md +++ b/_includes/parse-server/file-adapters.md @@ -4,12 +4,94 @@ Parse Server allows developers to choose from several options when hosting files * `GridStoreAdapter`, which is backed by MongoDB; * `S3Adapter`, which is backed by [Amazon S3](https://aws.amazon.com/s3/); or -* `GCSAdapter`, which is backed by [Google Cloud Storage](https://cloud.google.com/storage/) +* `GCSAdapter`, which is backed by [Google Cloud Storage](https://cloud.google.com/storage/); or +* `FSAdapter`, local file storage `GridStoreAdapter` 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 below. When using files on Parse, you will need to use the `publicServerURL` option in your Parse Server config. This is the URL that files will be accessed from, so it should be a URL that resolves to your Parse Server. Make sure to include your mount point in this URL. +When using `Postgres`, you will need to configure `S3Adapter`, `GCSAdapter`, or `FSAdapter` for file support. The `GridStoreAdapter` does not work with `Postgres`. + +## Configuring `GridStoreAdapter` + +If you are using `Mongo` and don't need file encryption, there are no additional steps needed to use the `GridStoreAdapter`. If you'd like to enable file encryption follow these instructions to configure Parse Server to use `GridStoreAdapter` with file encryption. + +### Set up file encryption +File encryption is available in parse-server 4.4.0+. The `GridStoreAdapter` can encrypt files at rest in `Mongo` using AES256-GCM, allowing the adapter to detect if files are tampered with. + +To use, simply do any of the following: +- Use the environment variable `PARSE_SERVER_ENCRYPTION_KEY` +- Pass in --encryptionKey in the command line when starting your server +- Initialize ParseServer with `encryptionKey="Your file encryptionKey"`. + +An example starting your Parse Server in `index.js` is below: + +```javascript +const api = new ParseServer({ + databaseURI: databaseUri || 'mongodb://localhost:27017/dev', + cloud: process.env.PARSE_SERVER_CLOUD || __dirname + '/cloud/main.js', + appId: process.env.PARSE_SERVER_APPLICATION_ID || 'myAppId', + masterKey: process.env.PARSE_SERVER_MASTER_KEY || '', + encryptionKey: process.env.PARSE_SERVER_ENCRYPTION_KEY, //Add your file key here. Keep it secret + ... +}); +``` + +Be sure not to lose your key or change it after encrypting files. + +### Enabling encryption on a server that already has unencrypted files +When this is the case, it is recommended to start up a development parse-server (or a separate process from your main process) that has the same configuration as your production server. On the development server, initialize the file adapter as above with the new key and do the following after initialization in your `index.js`: + +```javascript +//You probably want to back up your unencrypted files before doing this. +//This can take awhile depending on how many files and how large they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey(); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + +### Rotating your encryption key +Periodically you may want to rotate your encryptionKey for security reasons. When this is the case, it is recommended to start up a development parse-server (or a separate process from your main process) that has the same configuration as your production server. On the development server, initialize the file adapter with the new key and do the following in your `index.js` (you will need your `oldKey`): + +```javascript +//This can take awhile depending on how many files and how large they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey({oldKey: oldKey}); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + +### Removing file encryption +When this is the case, it is recommended to start up a development parse-server (or a separate process from your main process) that has the same configuration as your production server. Different from the previous examples, don't initialize your fileAdapter with a `encryptionKey`. Pass in your `oldKey` to `rotateEncryptionKey()`. + +```javascript +const api = new ParseServer({ + databaseURI: databaseUri || 'mongodb://localhost:27017/dev', + cloud: process.env.PARSE_SERVER_CLOUD || __dirname + '/cloud/main.js', + appId: process.env.PARSE_SERVER_APPLICATION_ID || 'myAppId', + masterKey: process.env.PARSE_SERVER_MASTER_KEY || '', + //No encryptionKey here + ... +}); + +//This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory +//It is not recommended to do this on the production server, deploy a development server to complete the process. +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey({oldKey: oldKey}); +console.log('Files rotated to unencrypted with noKey: ' + rotated); +console.log('Files that couldn't be rotated to unencrypted with noKey: ' + notRotated); + +``` + +### Rotating the key for a subset of files +This is useful if for some reason there were errors and some of the files weren't rotated and returned in `notRotated`. The process is the same as the previous examples, but pass in your `oldKey` along with the array of `fileNames` to `rotateEncryptionKey()`. + +```javascript +//This can take awhile depending on how many files and how large they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey({oldKey: oldKey, fileNames: ["fileName1.png","fileName2.png"]}); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + ## Configuring `S3Adapter` If you'd like to use Amazon S3, follow these instructions to configure Parse Server to use `S3Adapter`. @@ -28,8 +110,7 @@ First you will create a bucket in S3 to hold these files. 8. Now select the **Policies** tab, then **Create Policy**. 9. Select **Create Your Own Policy**, fill out a **Policy Name**. 10. Copy the following config in **Policy Document**, changing **BUCKET_NAME** for the name of the bucket you created earlier. (note: this is a little more permissive than Parse Server needs, but it works for now) - - ```js + ```jsonc { "Version": "2012-10-17", "Statement": [ @@ -93,7 +174,7 @@ var api = new ParseServer({ Don't forget to change **S3_ACCESS_KEY**, **S3_SECRET_KEY** and **S3_BUCKET** to their correct value. -##### S3Adapter constructor options +### Adapter Options ```js new S3Adapter(accessKey, secretKey, bucket, options) @@ -112,6 +193,60 @@ new S3Adapter(accessKey, secretKey, bucket, options) | baseUrlDirect | Key in `options`. Is `true` if the file adapter should ignore the bucket prefix when determining the file location for direct access. | Optional. Default: `false`. To be used when `directAccess=true` and `baseUrl` is set. When set to `true`, the file adapter returns a file URL in format `baseUrl/filename`. Example for `baseUrl='http://domain.com/folder'` and `baseUrlDirect=true` the returned file location is `http://domain.com/folder/file.txt`. | | globalCacheControl | Key in `options`. The `Cache-Control` http header to set in the file request. | Optional. Default: `null`. Example: `public, max-age=86400` for 24 hrs caching. More info [here](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1). | +### S3-compatible Services +#### Digital Ocean Spaces + +[Digital Ocean Spaces](https://try.digitalocean.com/cloud-storage) is an S3-compatible storage service in the cloud. See their [documentation](https://docs.digitalocean.com/products/spaces/) for more details. + +```javascript +const s3Options = { + bucket: "SPACES_BUCKET_NAME", + baseUrl: "SPACES_BASE_URL", + region: "SPACES_REGION", + bucketPrefix: "SPACES_BUCKET_PREFIX", + s3overrides: { + accessKeyId: "SPACES_ACCESS_KEY", + secretAccessKey: "SPACES_SECRET_KEY", + endpoint: 'SPACES_ENDPOINT' + } +}; +``` + +#### Linode Object Storage + +[Linode Object Storage](https://www.linode.com/products/object-storage/) is an S3-compatible storage service in the cloud. See their [documentation](https://www.linode.com/docs/guides/how-to-use-object-storage/) for more details. + +```js +const s3Options = { + bucket: "S3_BUCKET_NAME", + baseUrl: "S3_BASE_URL", // https://myBucket.myRegion.linodeobjects.com + region: "S3_REGION", // possible values: eu-central-1 or us-east-1 + s3overrides: { + accessKeyId: "S3_ACCESS_KEY", // bucket access key + secretAccessKey: "S3_SECRET_KEY", // bucket secret key + endpoint: "S3_ENDPOINT", // regionName.linodeobjects.com + }, +}; +``` + +#### Backblaze B2 Cloud Storage + +[Backblaze B2 Cloud Storage](https://www.backblaze.com/b2/cloud-storage.html) is an S3-compatible storage service in the cloud. See their [documentation](https://www.backblaze.com/b2/docs/) for more details. + +```js +const s3Options = { + bucket: "S3_BUCKET", + baseUrl: "S3_BASE_URL", // taken from BackBlaze, normally https://BUCKET.s3.REGION.backblazeb2.com + signatureVersion: 'v4', + region: 'us-west-000', + s3overrides: { + endpoint: "S3_ENDPOINT", // check backblaze bucket endpoint + accessKeyId: "S3_ACCESS_KEY", + secretAccessKey: "S3_SECRET_KEY" + }, +}; +``` + ## Configuring `GCSAdapter` @@ -167,46 +302,6 @@ var api = new ParseServer({ }); ``` -##### S3Adapter configuration for Digital Ocean Spaces - -Spaces is an S3 equivalent prodivided by Digital Ocean. It's use the same api as S3 so you can use it with the S3 Adapter. -You just need to change the AWS Endpoint to point to your Spaces endpoint. - -```javascript -... -var S3Adapter = require('parse-server').S3Adapter; -var AWS = require("aws-sdk"); - -//Set Digital Ocean Spaces EndPoint -const spacesEndpoint = new AWS.Endpoint(process.env.SPACES_ENDPOINT); -//Define S3 options -var s3Options = { - bucket: process.env.SPACES_BUCKET_NAME, - baseUrl: process.env.SPACES_BASE_URL, - region: process.env.SPACES_REGION, - directAccess: true, - globalCacheControl: "public, max-age=31536000", - bucketPrefix: process.env.SPACES_BUCKET_PREFIX, - s3overrides: { - accessKeyId: process.env.SPACES_ACCESS_KEY, - secretAccessKey: process.env.SPACES_SECRET_KEY, - endpoint: spacesEndpoint - } -}; - -var s3Adapter = new S3Adapter(s3Options); - -var api = new ParseServer({ - databaseURI: databaseUri || 'mongodb://localhost:27017/dev', - appId: process.env.APP_ID || 'APPLICATION_ID', - masterKey: process.env.MASTER_KEY || 'MASTER_KEY', - ... - filesAdapter: s3Adapter - ... -}); -``` - - ##### GCSAdapter constructor options ```js @@ -221,3 +316,98 @@ new GCSAdapter(projectId, keyfilePath, bucket, options) | options | JavaScript object (map) that can contain: | | | bucketPrefix | Key in `options`. Set to create all the files with the specified prefix added to the filename. Can be used to put all the files for an app in a folder with 'folder/'. | Optional. Default: '' | | directAccess | Key in `options`. Controls whether reads are going directly to GCS or proxied through your Parse Server. | Optional. Default: false | + +## Configuring `FSAdapter` + +To use the [FSAdapter](https://github.com/parse-community/parse-server-fs-adapter), simply initialize your Parse Server in `index.js` by doing the following: + +```javascript +var FSFilesAdapter = require('@parse/fs-files-adapter'); + +var fsAdapter = new FSFilesAdapter({ + "filesSubDirectory": "my/files/folder" // optional, defaults to ./files +}); + +var api = new ParseServer({ + appId: 'my_app', + masterKey: 'master_key', + filesAdapter: fsAdapter +}) +``` + +### Using `FSAdapter` with multiple instances of Parse Server +When using [parse-server-fs-adapter](https://github.com/parse-community/parse-server-fs-adapter) across multiple Parse Server instances it's important to establish "centralization" of your file storage (this is the same premise as the other file adapters, you are sending/recieving files through a dedicated link). You can accomplish this at the file storage level by Samba mounting (or any other type of mounting) your storage to each of your parse-server instances, e.g if you are using Parse Server via docker (volume mount your SMB drive to `- /Volumes/SMB-Drive/MyParseApp1/files:/parse-server/files`). All Parse Server instances need to be able to read/write to the same storage in order for parse-server-fs-adapter to work properly with parse-server. If the file storage isn't centralized, parse-server will have trouble locating files and you will get random behavior on client-side. + +### Set up file encryption +File encryption is available in parse-server-fs-adapter 1.1.0+. The `FSAdapter` can encrypt files at rest for local storage using AES256-GCM, allowing the adapter to detect if files are tampered with. + +To use, simply do the same as above, but add a `encryptionKey`: + +```javascript +var FSFilesAdapter = require('@parse/fs-files-adapter'); + +var fsAdapter = new FSFilesAdapter({ + "filesSubDirectory": "my/files/folder", // optional, defaults to ./files + "encryptionKey": "someKey" //mandatory if you want to encrypt files +}); + +var api = new ParseServer({ + appId: 'my_app', + masterKey: 'master_key', + filesAdapter: fsAdapter +}) +``` + +Be sure not to lose your key or change it after encrypting files. + +### Enabling encryption on a server that already has unencrypted files +When this is the case, it is recommended to start up a development parse-server (or a separate process from your main process) that has the same configuration as your production server. On the development server, initialize the file adapter as above with the new key and do the following after initialization in your `index.js`: + +```javascript +//You probably want to back up your unencrypted files before doing this. +//This can take awhile depending on how many files and how large they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey(); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + +### Rotating your encryption key +Periodically you may want to rotate your `encryptionKey` for security reasons. When this is the case, it is recommended to start up a development parse-server (or a separate process from your main process) that has the same configuration as your production server. On the development server, initialize the file adapter with the new key and do the following in your `index.js` (you will need your `oldKey`): + +```javascript +//This can take awhile depending on how many files and how large they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey({oldKey: oldKey}); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` + +### Removing file encryption +When this is the case, it is recommended to start up a development parse-server (or a separate process from your main process) that has the same configuration as your production server. Different from the previous examples, don't initialize your fileAdapter with a `encryptionKey`. Pass in your `oldKey` to `rotateEncryptionKey()`. + +```javascript +const api = new ParseServer({ + databaseURI: databaseUri || 'mongodb://localhost:27017/dev', + cloud: process.env.PARSE_SERVER_CLOUD || __dirname + '/cloud/main.js', + appId: process.env.PARSE_SERVER_APPLICATION_ID || 'myAppId', + masterKey: process.env.PARSE_SERVER_MASTER_KEY || '', + filesAdapter: new FSFilesAdapter(), //No encryptionKey supplied + ... +}); + +//This can take awhile depending on how many files and how larger they are. It will attempt to rotate the key of all files in your filesSubDirectory +//It is not recommended to do this on the production server, deploy a development server to complete the process. +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey({oldKey: oldKey}); +console.log('Files rotated to unencrypted with noKey: ' + rotated); +console.log('Files that couldn't be rotated to unencrypted with noKey: ' + notRotated); + +``` + +### Rotating the key for a subset of files +This is useful if for some reason there were errors and some of the files weren't rotated and returned in `notRotated`. The process is the same as the previous examples, but pass in your `oldKey` along with the array of `fileNames` to `rotateEncryptionKey()`. + +```javascript +//This can take awhile depending on how many files and how large they are. It will attempt to rotate the key of all files in your filesSubDirectory +const {rotated, notRotated} = await api.filesAdapter.rotateEncryptionKey({oldKey: oldKey, fileNames: ["fileName1.png","fileName2.png"]}); +console.log('Files rotated to newKey: ' + rotated); +console.log('Files that couldn't be rotated to newKey: ' + notRotated); +``` diff --git a/_includes/parse-server/getting-started.md b/_includes/parse-server/getting-started.md index 250d2fb04..1ed5a2eb5 100644 --- a/_includes/parse-server/getting-started.md +++ b/_includes/parse-server/getting-started.md @@ -1,26 +1,30 @@ # Getting Started -Parse Server is an open source version of the Parse backend that can be deployed to any infrastructure that can run Node.js. You can find the source on the [GitHub repo](https://github.com/parse-community/parse-server). +Parse Server is an open source backend that can be deployed to any infrastructure that can run Node.js. You can find the source on the [GitHub repo](https://github.com/parse-community/parse-server). -* Parse Server is not dependent on the hosted Parse backend. -* Parse Server uses MongoDB directly, and is not dependent on the Parse hosted database. -* You can migrate an existing app to your own infrastructure. +* Parse Server uses MongoDB or PostgreSQL as a database. +* You can deploy and run Parse Server on your own infrastructure. * You can develop and test your app locally using Node. +The following guide describes how to set up Parse Server on your personal computer for local development. If you want to be able to access Parse Server from anywhere and make your app accessible publicly, you would want to deploy Parse Server to a cloud service provider like Amazon Web Services, Google Cloud, Microsoft Azure, Heroku or DigitalOcean. These providers vary in set-up complexity, configuration efforts, pricing model and required knowledge to secure your deployment. You can find guides for how to deploy Parse Server for specific providers in [Deploying Parse Server]({{ site.baseUrl }}/parse-server/guide/#deploying-parse-server) section. + +⚠️ Before making Parse Server accessible publicly, we strongly recommend to review all of your Parse Server configuration and read our [best practice]({{ site.baseUrl }}/parse-server/guide/#best-practice) guide. Failing to properly adapt your Parse Server configuration for a publicly accessible environment may make your deployment vulnerable to malicious intrusions, data leaks and unexpected cost increases. + **Prerequisites** -* Node 8 or newer -* MongoDB version 3.6 -* Python 2.x (For Windows users, 2.7.1 is the required version) -* For deployment, an infrastructure provider like Heroku or AWS +* Node +* MongoDB (to use Parse Server with MongoDB) +* PostgreSQL (to use Parse Server with PostgreSQL) + +Ensure that the Node.js version is compatible with your version of Parse Server, for details see the [compatibility table](https://github.com/parse-community/parse-server#compatibility). The fastest and easiest way to get started is to run MongoDB and Parse Server locally. Use the bootstrap script to set up Parse Server in the current directory. ```bash -$ sh <(curl -fsSL https://raw.githubusercontent.com/parse-community/parse-server/master/bootstrap.sh) -$ npm install -g mongodb-runner -$ mongodb-runner start -$ npm start +sh <(curl -fsSL https://raw.githubusercontent.com/parse-community/parse-server/master/bootstrap.sh) +npm install -g mongodb-runner +mongodb-runner start +npm start ``` 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. @@ -41,42 +45,42 @@ http://localhost:1337/parse/classes/GameScore You should get a response similar to this: -```js +```jsonc { "objectId": "2ntvSpRGIK", - "createdAt": "2016-03-11T23:51:48.050Z" + "createdAt": "2022-01-01T12:23:45.678Z" } ``` You can now retrieve this object directly (make sure to replace `2ntvSpRGIK` with the actual `objectId` you received when the object was created): ```bash -$ curl -X GET \ +curl -X GET \ -H "X-Parse-Application-Id: APPLICATION_ID" \ http://localhost:1337/parse/classes/GameScore/2ntvSpRGIK ``` -```js +```jsonc // Response { "objectId": "2ntvSpRGIK", "score": 123, "playerName": "Sean Plott", "cheatMode": false, - "updatedAt": "2016-03-11T23:51:48.050Z", - "createdAt": "2016-03-11T23:51:48.050Z" + "updatedAt": "2022-01-01T12:23:45.678Z", + "createdAt": "2022-01-01T12:23:45.678Z" } ``` Keeping tracks of individual object ids is not ideal, however. In most cases you will want to run a query over the collection, like so: -``` -$ curl -X GET \ +```bash +curl -X GET \ -H "X-Parse-Application-Id: APPLICATION_ID" \ http://localhost:1337/parse/classes/GameScore ``` -```js +```jsonc // The response will provide all the matching objects within the `results` array: { "results": [ @@ -85,15 +89,15 @@ $ curl -X GET \ "score": 123, "playerName": "Sean Plott", "cheatMode": false, - "updatedAt": "2016-03-11T23:51:48.050Z", - "createdAt": "2016-03-11T23:51:48.050Z" + "updatedAt": "2022-01-01T12:23:45.678Z", + "createdAt": "2022-01-01T12:23:45.678Z" } ] } ``` -To learn more about using saving and querying objects on Parse Server, check out the [documentation]({{ site.baseUrl }}/) for the SDK you will be using in your app. +To learn more about using, saving, and querying objects on Parse Server, check out the [documentation]({{ site.baseUrl }}/) for the SDK you will be using in your app. ## Connect your app to Parse Server diff --git a/_includes/parse-server/MongoReadPreference.md b/_includes/parse-server/mongo-read-preference.md similarity index 100% rename from _includes/parse-server/MongoReadPreference.md rename to _includes/parse-server/mongo-read-preference.md diff --git a/_includes/parse-server/push-notifications-ios.md b/_includes/parse-server/push-notifications-ios.md index e5b55251a..b82df42b9 100644 --- a/_includes/parse-server/push-notifications-ios.md +++ b/_includes/parse-server/push-notifications-ios.md @@ -13,10 +13,10 @@ application.registerForRemoteNotifications() ```objc // Objective-C UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | - UIUserNotificationTypeBadge | - UIUserNotificationTypeSound); +UIUserNotificationTypeBadge | +UIUserNotificationTypeSound); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes - categories:nil]; +categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; ``` @@ -24,10 +24,10 @@ UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTy ```csharp // Xamarin UIUserNotificationType notificationTypes = (UIUserNotificationType.Alert | - UIUserNotificationType.Badge | - UIUserNotificationType.Sound); +UIUserNotificationType.Badge | +UIUserNotificationType.Sound); var settings = UIUserNotificationSettings.GetSettingsForTypes(notificationTypes, - new NSSet(new string[] { })); +new NSSet(new string[] { })); UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); UIApplication.SharedApplication.RegisterForRemoteNotifications(); @@ -62,38 +62,29 @@ func application(application: UIApplication, didReceiveRemoteNotification userIn ```objc // Objective-C -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - // Store the deviceToken in the current installation and save it to Parse. - PFInstallation *currentInstallation = [PFInstallation currentInstallation]; - [currentInstallation setDeviceTokenFromData:deviceToken]; - [currentInstallation saveInBackground]; -} - -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { - [PFPush handlePush:userInfo]; -} +UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | + UIUserNotificationTypeBadge | + UIUserNotificationTypeSound); +UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes + categories:nil]; +[application registerUserNotificationSettings:settings]; +[application registerForRemoteNotifications]; ``` ```csharp // Xamarin -public override void DidRegisterUserNotificationSettings(UIApplication application, - UIUserNotificationSettings notificationSettings) { - application.RegisterForRemoteNotifications(); -} - -public override void RegisteredForRemoteNotifications(UIApplication application, - NSData deviceToken) { - ParseInstallation installation = ParseInstallation.CurrentInstallation; - installation.SetDeviceTokenFromData(deviceToken); - - installation.SaveAsync(); -} +UIUserNotificationType notificationTypes = (UIUserNotificationType.Alert | + UIUserNotificationType.Badge | + UIUserNotificationType.Sound); +var settings = UIUserNotificationSettings.GetSettingsForTypes(notificationTypes, + new NSSet(new string[] { })); +UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); +UIApplication.SharedApplication.RegisterForRemoteNotifications(); -public override void ReceivedRemoteNotification(UIApplication application, - NSDictionary userInfo) { - // We need this to fire userInfo into ParsePushNotificationReceived. - ParsePush.HandlePush(userInfo); -} +// Handle Push Notifications +ParsePush.ParsePushNotificationReceived += (object sender, ParsePushNotificationEventArgs args) => { + // Process Push Notification payload here. +}; ``` ##### Compile and run! diff --git a/_includes/parse-server/push-notifications.md b/_includes/parse-server/push-notifications.md index 93aa34f03..d0578f918 100644 --- a/_includes/parse-server/push-notifications.md +++ b/_includes/parse-server/push-notifications.md @@ -44,7 +44,7 @@ You will need to obtain some credentials from FCM and APNS in order to send push #### APNS (iOS) -If you are setting up push notifications on iOS, tvOS or macOS for the first time, we recommend you visit the [raywenderlich.com's Push Notifications tutorial](https://www.raywenderlich.com/123862/push-notifications-tutorial) or [appcoda.com's iOS Push tutorial](https://www.appcoda.com/push-notification-ios/) to help you obtain a production Apple Push Certificate. Parse Server supports the PFX (`.p12`) file exported from Keychain Access. Parse Server also supports the push certificate and key in `.pem` format. Token-based authentication instead of a certificate is supported as well. +If you are setting up push notifications on iOS, tvOS or macOS for the first time, we recommend you visit the [raywenderlich.com's Push Notifications tutorial](https://www.raywenderlich.com/11395893-push-notifications-tutorial-getting-started) or [appcoda.com's iOS Push tutorial](https://www.appcoda.com/push-notification-ios/) to help you obtain a production Apple Push Certificate. Parse Server supports the PFX (`.p12`) file exported from Keychain Access. Parse Server also supports the push certificate and key in `.pem` format. Token-based authentication instead of a certificate is supported as well. #### FCM (Android) @@ -133,7 +133,7 @@ push: { } ``` -The configuration for macOS and tvOS works exactly as for iOS. Just add an additional configuration for each plattform under the appropriate key. Please note the key for macOS is `osx` and for tvOS is `tvos`. If you need to support both the dev and prod certificates, you can do that for all Apple plattforms like described above. +The configuration for macOS and tvOS works exactly as for iOS. Just add an additional configuration for each platform under the appropriate key. Please note the key for macOS is `osx` and for tvOS is `tvos`. If you need to support both the dev and prod certificates, you can do that for all Apple platforms like described above. ```js var server = new ParseServer({ @@ -237,9 +237,32 @@ After sending this to your Parse Server, you should see the push notifications s In your Parse Server logs, you can see something similar to -```js +```jsonc // FCM request and response -{"request":{"params":{"priority":"normal","data":{"time":"2016-02-10T03:21:59.065Z","push_id":"NTDgWw7kp8","data":"{\"alert\":\"All work and no play makes Jack a dull boy.\"}"}}},"response":{"multicast_id":5318039027588186000,"success":1,"failure":0,"canonical_ids":0,"results":[{"registration_id":"APA91bEdLpZnXT76vpkvkD7uWXEAgfrZgkiH_ybkzXqhaNcRw1KHOY0s9GUKNgneGxe2PqJ5Swk1-Vf852kpHAP0Mhoj5wd1MVXpRsRr_3KTQo_dkNd_5wcQ__yWnWLxbeM3kg_JziJK","message_id":"0:1455074519347821%df0f8ea7f9fd7ecd"}]}} +{ + "request": { + "params": { + "priority": "normal", + "data": { + "time": "2022-01-01T12:23:45.678Z", + "push_id": "NTDgWw7kp8", + "data": "{\"alert\":\"All work and no play makes Jack a dull boy.\"}" + } + } + }, + "response": { + "multicast_id": 5318039027588186000, + "success": 1, + "failure": 0, + "canonical_ids": 0, + "results": [ + { + "registration_id": "APA91bEdLpZnXT76vpkvkD7uWXEAgfrZgkiH_ybkzXqhaNcRw1KHOY0s9GUKNgneGxe2PqJ5Swk1-Vf852kpHAP0Mhoj5wd1MVXpRsRr_3KTQo_dkNd_5wcQ__yWnWLxbeM3kg_JziJK", + "message_id": "0:1455074519347821%df0f8ea7f9fd7ecd" + } + ] + } +} ``` ```sh diff --git a/_includes/parse-server/third-party-auth.md b/_includes/parse-server/third-party-auth.md index 60982dee5..ef52d9aef 100644 --- a/_includes/parse-server/third-party-auth.md +++ b/_includes/parse-server/third-party-auth.md @@ -3,17 +3,21 @@ Parse Server supports 3rd party authentication with * Apple +* Apple Game Center * Facebook -* Facebook AccountKit * Github * Google +* Google Play Game Services * Instagram * Janrain Capture * Janrain Engage +* Keycloak * LDAP +* Line * LinkedIn * Meetup * Microsoft Graph +* OAuth * PhantAuth * QQ * Spotify @@ -46,7 +50,7 @@ Note, most of them don't require a server configuration so you can use them dire ### Facebook `authData` -```js +```jsonc { "facebook": { "id": "user's Facebook id number as a string", @@ -57,37 +61,9 @@ Note, most of them don't require a server configuration so you can use them dire ``` Learn more about [Facebook login](https://developers.facebook.com/docs/authentication/). -### Facebook AccountKit `authData` -```js -{ - "facebookaccountkit": { - "id": "user's Facebook Account Kit id number as a string", - "access_token": "an authorized Facebook Account Kit access token for the user", - // optional, access token via authorization code does not seem to have this in response - "last_refresh": "time stamp at which token was last refreshed" - } -} -``` -The options passed to Parse server: -```js -{ - auth: { - facebookaccountkit: { - // your facebook app id - appIds: ["id1", "id2"], - // optional, if you have enabled the 'Require App Secret' setting in your app's dashboards - appSecret: "App secret from Account Kit setting" - } - } -} -``` -Learn more about [Facebook Account Kit](https://developers.facebook.com/docs/accountkit). - -Two ways to [retrieve access token](https://developers.facebook.com/docs/accountkit/accesstokens). - ### Twitter `authData` -```js +```jsonc { "twitter": { "id": "user's Twitter id number as a string", @@ -115,7 +91,7 @@ Learn more about [Twitter login](https://developer.twitter.com/en/docs/twitter-f ### Anonymous user `authData` -```js +```jsonc { "anonymous": { "id": "random UUID with lowercase hexadecimal digits" @@ -127,7 +103,7 @@ Learn more about [Twitter login](https://developer.twitter.com/en/docs/twitter-f As of Parse Server 3.5.0 you can use [Sign In With Apple](https://developer.apple.com/sign-in-with-apple/get-started/). -```js +```jsonc { "apple": { "id": "user", @@ -145,7 +121,7 @@ Using Apple Sign In through the Apple JS SDK or through the REST service will on { auth: { apple: { - client_id: "", // optional (for extra validation), use the Service ID from Apple. + clientId: 'com.example.app', // optional, for extra validation; replace with the bundle ID provided by Apple. }, } } @@ -155,7 +131,7 @@ Learn more about [Sign In With Apple](https://developer.okta.com/blog/2019/06/04 ### Github `authData` -```js +```jsonc { "github": { "id": "user's Github id (string)", @@ -168,7 +144,7 @@ Learn more about [Sign In With Apple](https://developer.okta.com/blog/2019/06/04 Google oauth supports validation of id_token's and access_token's. -```js +```jsonc { "google": { "id": "user's Google id (string)", @@ -180,7 +156,7 @@ Google oauth supports validation of id_token's and access_token's. ### Instagram `authData` -```js +```jsonc { "instagram": { "id": "user's Instagram id (string)", @@ -190,16 +166,46 @@ Google oauth supports validation of id_token's and access_token's. } ``` +### Keycloak `authData` + +```jsonc +{ + "keycloak": { + "access_token": "access token from keycloak JS client authentication", + "id": "the id retrieved from client authentication in Keycloak", + "roles": ["the roles retrieved from client authentication in Keycloak"], + "groups": ["the groups retrieved from client authentication in Keycloak"] + } +} +``` + +The authentication module will test if the authData is the same as the userinfo oauth call, by comparing the attributes. + +Copy the JSON config file generated on Keycloak ([tutorial](https://www.keycloak.org/docs/latest/securing_apps/index.html#_javascript_adapter)) +and paste it inside of a folder (Ex.: `auth/keycloak.json`) in your server. + +The options passed to Parse Server: + +```js +{ + auth: { + keycloak: { + config: require(`./auth/keycloak.json`) // Required + } + } +} +``` + ### Configuring Parse Server for LDAP -The [LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) module can check if a +The [LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) module can check if a user can authenticate (bind) with the given credentials. Optionally, it can also check if the user is in a certain group. This check is done using a user specified query, called an [LDAP Filter](https://ldap.com/ldap-filters/). The query should return all groups which the user is a member of. The `cn` attribute of the query results is compared to `groupCn`. To build a query which works with your LDAP server, you can use a LDAP client like [Apache Directory Studio](https://directory.apache.org/studio/). -```js +```jsonc { "ldap": { "url": "ldap://host:port", @@ -215,7 +221,7 @@ If either `groupCN` or `groupFilter` is not specified, the group check is not pe Example Configuration (this works with the public LDAP test server hosted by Forumsys): -```js +```jsonc { "ldap": { "url": "ldap://ldap.forumsys.com:389", @@ -229,7 +235,7 @@ Example Configuration (this works with the public LDAP test server hosted by For authData: -```js +```jsonc { "authData": { "ldap": { @@ -242,7 +248,7 @@ authData: ### LinkedIn `authData` -```js +```jsonc { "linkedin": { "id": "user's LinkedIn id (string)", @@ -254,7 +260,7 @@ authData: ### Meetup `authData` -```js +```jsonc { "meetup": { "id": "user's Meetup id (string)", @@ -265,7 +271,7 @@ authData: ### Microsoft Graph `authData` -```js +```jsonc { "microsoft": { "id": "user's microsoft id (string)", // required @@ -283,7 +289,7 @@ To [get access on behalf of a user](https://docs.microsoft.com/en-us/graph/auth- As of Parse Server 3.7.0 you can use [PhantAuth](https://www.phantauth.net/). -```js +```jsonc { "phantauth": { "id": "user's PhantAuth sub (string)", @@ -296,7 +302,7 @@ Learn more about [PhantAuth](https://www.phantauth.net/). ### QQ `authData` -```js +```jsonc { "qq": { "id": "user's QQ id (string)", @@ -307,7 +313,7 @@ Learn more about [PhantAuth](https://www.phantauth.net/). ### Spotify `authData` -```js +```jsonc { "spotify": { "id": "user's spotify id (string)", @@ -318,7 +324,7 @@ Learn more about [PhantAuth](https://www.phantauth.net/). ### vKontakte `authData` -```js +```jsonc { "vkontakte": { "id": "user's vkontakte id (string)", @@ -342,7 +348,7 @@ Learn more about [PhantAuth](https://www.phantauth.net/). ### WeChat `authData` -```js +```jsonc { "wechat": { "id": "user's wechat id (string)", @@ -353,7 +359,7 @@ Learn more about [PhantAuth](https://www.phantauth.net/). ### Weibo `authData` -```js +```jsonc { "weibo": { "id": "user's weibo id (string)", diff --git a/_includes/parse-server/usage.md b/_includes/parse-server/usage.md index ecb0e5bea..65e41db90 100644 --- a/_includes/parse-server/usage.md +++ b/_includes/parse-server/usage.md @@ -5,7 +5,7 @@ Parse Server is meant to be mounted on an [Express](http://expressjs.com/) app. The constructor returns an API object that conforms to an [Express Middleware](http://expressjs.com/en/api.html#app.use). This object provides the REST endpoints for a Parse app. Create an instance like so: ```js -var api = new ParseServer({ +const api = new ParseServer({ databaseURI: 'mongodb://your.mongo.uri', cloud: './cloud/main.js', appId: 'myAppId', @@ -18,7 +18,7 @@ var api = new ParseServer({ The parameters are as follows: -* `databaseURI`: Connection string URI for your MongoDB. +* `databaseURI`: Connection string for your database. * `cloud`: Path to your app’s Cloud Code. * `appId`: A unique identifier for your app. * `fileKey`: A key that specifies a prefix used for file storage. For migrated apps, this is necessary to provide access to files already hosted on Parse. @@ -35,16 +35,16 @@ The parameters are as follows: The Parse Server object was built to be passed directly into `app.use`, which will mount the Parse API at a specified path in your Express app: ```js -var express = require('express'); -var ParseServer = require('parse-server').ParseServer; +const express = require('express'); +const ParseServer = require('parse-server').ParseServer; -var app = express(); -var api = new ParseServer({ ... }); +const app = express(); +const api = new ParseServer({ ... }); // Serve the Parse API at /parse URL prefix app.use('/parse', api); -var port = 1337; +const port = 1337; app.listen(port, function() { console.log('parse-server-example running on port ' + port + '.'); }); diff --git a/_includes/php/installation.md b/_includes/php/installation.md index 12dcd04a4..5aaa1b414 100644 --- a/_includes/php/installation.md +++ b/_includes/php/installation.md @@ -8,7 +8,7 @@ Note that the Parse PHP SDK requires PHP 5.4 or newer. It can also run on HHVM ( [Get Composer], the PHP package manager. Then create a composer.json file in your projects root folder, containing: -```json +```jsonc { "require": { "parse/php-sdk" : "1.4.*" diff --git a/_includes/php/objects.md b/_includes/php/objects.md index c4abe9d5d..7b06bb93e 100644 --- a/_includes/php/objects.md +++ b/_includes/php/objects.md @@ -35,9 +35,15 @@ try { After this code runs, you will probably be wondering if anything really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this: -```json -objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, -createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `GameScore` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. diff --git a/_includes/php/setup.md b/_includes/php/setup.md index 4d7cbe667..070798e15 100644 --- a/_includes/php/setup.md +++ b/_includes/php/setup.md @@ -46,7 +46,7 @@ if($health['status'] === 200) { If you wanted to analyze it further the health response may look something like this. -```json +```jsonc { "status" : 200, "response" : { @@ -62,7 +62,7 @@ Note that it is _not_ guaranteed that 'response' will be a parsable json array. A couple examples of bad health responses could include an incorrect mount path, port or domain. -```json +```jsonc // ParseClient::setServerURL('http://localhost:1337', 'not-good'); { "status": 404, diff --git a/_includes/php/users.md b/_includes/php/users.md index 61b6439cd..ac67d63f5 100644 --- a/_includes/php/users.md +++ b/_includes/php/users.md @@ -88,7 +88,7 @@ Note that this will only send if the account for the email requested has not alr It would be bothersome if the user had to log in every time they open your app. You can avoid this by using the cached current `ParseUser` object. -By default, whenever you use any signup or login methods, the user will be saved in PHP Session storage (The `$_SESSION` superglobal.) +By default, whenever you use any signup or login methods, the user will be saved in PHP Session storage, the `$_SESSION` superglobal. When re-initializing the Parse PHP SDK, you may need to instruct PHP to load the stored session data into the `$_SESSION` superglobal using `session_start()` before initializing the Parse PHP SDK to make Parse use persistent storage and continue the previous user session. ```php $currentUser = ParseUser::getCurrentUser(); diff --git a/_includes/rest/analytics.md b/_includes/rest/analytics.md index 1158ab46b..3d71fb701 100644 --- a/_includes/rest/analytics.md +++ b/_includes/rest/analytics.md @@ -34,17 +34,19 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/events/AppOpened

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('POST', '/parse/events/AppOpened', json.dumps({
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('POST', '/parse/events/AppOpened', '', {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -73,22 +75,25 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/events/Search

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/events/Search', json.dumps({
-       "dimensions": {
-         "priceRange": "1000-1500",
-         "source": "craigslist",
-         "dayType": "weekday"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "dimensions": {
+        "priceRange": "1000-1500",
+        "source": "craigslist",
+        "dayType": "weekday"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -108,20 +113,23 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/events/Error

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/events/Error', json.dumps({
-       "dimensions": {
-         "code": "404"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "dimensions": {
+        "code": "404"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/cloud-code.md b/_includes/rest/cloud-code.md index 6ef8b69c7..5c498d8ba 100644 --- a/_includes/rest/cloud-code.md +++ b/_includes/rest/cloud-code.md @@ -15,17 +15,19 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/functions/hello

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('POST', '/parse/functions/hello', json.dumps({
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('POST', '/parse/functions/hello', '', {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -47,17 +49,20 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/jobs/userMigration

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/jobs/userMigration', json.dumps({
-       "plan": "paid"
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "plan": "paid"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/config.md b/_includes/rest/config.md index 931745995..4f682f219 100644 --- a/_includes/rest/config.md +++ b/_includes/rest/config.md @@ -14,21 +14,24 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/config

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/config', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing all the configuration parameters in the `params` field. -```json +```jsonc { "params": { "welcomeMessage": "Welcome to The Internet!", @@ -65,7 +68,7 @@ return request({ The response body is a JSON object containing a simple boolean value in the `result` field. -```json +```jsonc { "result": true } diff --git a/_includes/rest/files.md b/_includes/rest/files.md index 1fa321e14..5bfc88eb4 100644 --- a/_includes/rest/files.md +++ b/_includes/rest/files.md @@ -14,16 +14,19 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/files/hello.txt

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/files/hello.txt', 'Hello, World!', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "text/plain"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "text/plain"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -36,7 +39,7 @@ Location: http://files.parsetfss.com/bc9f32df-2957-4bb1-93c9-ec47d9870a05/tfss-d The response body is a JSON object containing the `name` of the file, which is the original file name prefixed with a unique identifier in order to prevent name collisions. This means you can save files with the same name, and the files will not overwrite one another. -```json +```jsonc { "url": "http://files.parsetfss.com/bc9f32df-2957-4bb1-93c9-ec47d9870a05/tfss-db295fb2-8a8b-49f3-aad3-dd911142f64f-hello.txt", "name": "db295fb2-8a8b-49f3-aad3-dd911142f64f-hello.txt" @@ -55,16 +58,19 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/files/pic.jpg

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/files/pic.jpg', open('myPicture.jpg', 'rb').read(), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "image/jpeg"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "image/jpeg"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -89,23 +95,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/classes/PlayerProfile

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/classes/PlayerProfile', json.dumps({
-       "name": "Andrew",
-       "picture": {
-         "name": "...profile.png",
-         "url:": "...profile.png",
-         "__type": "File"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "name": "Andrew",
+    "picture": {
+        "name": "...profile.png",
+        "url:": "...profile.png",
+        "__type": "File"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -124,15 +133,18 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/files/...profile.png

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/files/...profile.png', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/geopoints.md b/_includes/rest/geopoints.md index ede1baab7..ff9ca70f1 100644 --- a/_includes/rest/geopoints.md +++ b/_includes/rest/geopoints.md @@ -22,22 +22,25 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/classes/PlaceObject

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/classes/PlaceObject', json.dumps({
-       "location": {
-         "__type": "GeoPoint",
-         "latitude": 40.0,
-         "longitude": -30.0
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "location": {
+        "__type": "GeoPoint",
+        "latitude": 40.0,
+        "longitude": -30.0
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -64,30 +67,34 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/PlaceObject

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"limit":10,"where":json.dumps({
-       "location": {
-         "$nearSphere": {
-           "__type": "GeoPoint",
-           "latitude": 30.0,
-           "longitude": -20.0
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"limit": 10, "where": json.dumps({
+    "location": {
+        "$nearSphere": {
+            "__type": "GeoPoint",
+            "latitude": 30.0,
+            "longitude": -20.0
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/PlaceObject?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
This will return a list of results ordered by distance from 30.0 latitude and -20.0 longitude. The first result will be the nearest object. (Note that if an explicit `order` parameter is supplied, it will take precedence over the distance ordering.) For example, here are two results returned for the above query: -```json +```jsonc { "results": [ { @@ -96,8 +103,8 @@ This will return a list of results ordered by distance from 30.0 latitude and -2 "__type": "GeoPoint", "longitude": -30.0 }, - "updatedAt": "2011-12-06T22:36:04.983Z", - "createdAt": "2011-12-06T22:36:04.983Z", + "updatedAt": "2022-01-01T12:23:45.678Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "iFEPN5Gwoz" }, { @@ -106,8 +113,8 @@ This will return a list of results ordered by distance from 30.0 latitude and -2 "__type": "GeoPoint", "longitude": -20.0 }, - "updatedAt": "2011-12-06T22:36:26.143Z", - "createdAt": "2011-12-06T22:36:26.143Z", + "updatedAt": "2022-01-01T12:23:45.678Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "LAyNKSNTHT" } ] @@ -135,25 +142,29 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/PlaceObject

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "location": {
-         "$nearSphere": {
-           "__type": "GeoPoint",
-           "latitude": 30.0,
-           "longitude": -20.0
-         },
-         "$maxDistanceInMiles": 10.0
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "location": {
+        "$nearSphere": {
+            "__type": "GeoPoint",
+            "latitude": 30.0,
+            "longitude": -20.0
+        },
+        "$maxDistanceInMiles": 10.0
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/PlaceObject?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -186,33 +197,37 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/PizzaPlaceObject

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "location": {
-         "$within": {
-           "$box": [
-             {
-               "__type": "GeoPoint",
-               "latitude": 37.71,
-               "longitude": -122.53
-             },
-             {
-               "__type": "GeoPoint",
-               "latitude": 30.82,
-               "longitude": -122.37
-             }
-           ]
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "location": {
+        "$within": {
+            "$box": [
+                {
+                    "__type": "GeoPoint",
+                    "latitude": 37.71,
+                    "longitude": -122.53
+                },
+                {
+                    "__type": "GeoPoint",
+                    "latitude": 30.82,
+                    "longitude": -122.37
+                }
+            ]
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/PizzaPlaceObject?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -252,38 +267,42 @@ curl -X GET \ https://api.parse.com/1/classes/PizzaPlaceObject

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('api.parse.com', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "location": {
-         "$geoWithin": {
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('api.parse.com', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "location": {
+        "$geoWithin": {
             "$polygon": [
-              {
-                "__type": "GeoPoint",
-                "latitude": 25.774,
-                "longitude": -80.190
-              },
-              {
-                "__type": "GeoPoint",
-                "latitude": 18.466,
-                "longitude": -66.118
-              },
-              {
-                "__type": "GeoPoint",
-                "latitude": 32.321,
-                "longitude": -64.757
-              }
+                {
+                    "__type": "GeoPoint",
+                    "latitude": 25.774,
+                    "longitude": -80.190
+                },
+                {
+                    "__type": "GeoPoint",
+                    "latitude": 18.466,
+                    "longitude": -66.118
+                },
+                {
+                    "__type": "GeoPoint",
+                    "latitude": 32.321,
+                    "longitude": -64.757
+                }
             ]
-          }
-       }
-     })})
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/1/classes/PizzaPlaceObject?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/hooks.md b/_includes/rest/hooks.md index 6fe19762a..219c71298 100644 --- a/_includes/rest/hooks.md +++ b/_includes/rest/hooks.md @@ -60,16 +60,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/hooks/functions', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -97,16 +100,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions/sendMessage

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/hooks/functions/sendMessage', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -133,16 +139,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/hooks/triggers', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -178,16 +187,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers/Scores/beforeSave

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/hooks/triggers/Scores/beforeSave', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -219,8 +231,11 @@ and perform a `parse deploy` the usual way. ## Create function webhook To create a new function webhook post to /parse/hooks/functions with payload in the format -```json -{"functionName" : x, "url" : y} +```jsonc +{ + "functionName": "foo", + "url": "https://api.example.com/foo" +} ``` Post example: @@ -235,18 +250,22 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('POST', '/parse/hooks/functions', json.dumps(
-       {"functionName":"baz","url":"https://api.example.com/baz"}
-     ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('POST', '/parse/hooks/functions', json.dumps({
+    "functionName": "baz",
+    "url": "https://api.example.com/baz"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -272,18 +291,22 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('POST', '/parse/hooks/functions', json.dumps(
-       {"functionName":"bar","url":"https://api.example.com/bar"}
-     ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('POST', '/parse/hooks/functions', json.dumps({
+    "functionName": "bar",
+    "url": "https://api.example.com/bar"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -321,18 +344,23 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('POST', '/parse/hooks/triggers', json.dumps(
-       {"className": "Game", "triggerName": "beforeSave", "url": "https://api.example.com/Game/beforeSave"}
-     ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('POST', '/parse/hooks/triggers', json.dumps({
+    "className": "Game",
+    "triggerName": "beforeSave",
+    "url": "https://api.example.com/Game/beforeSave"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -362,18 +390,23 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('POST', '/parse/hooks/triggers', json.dumps(
-       {"className": "Tournament", "triggerName": "beforeDelete", "url": "https://api.example.com/Scores/beforeDelete"}
-     ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('POST', '/parse/hooks/triggers', json.dumps({
+    "className": "Tournament",
+    "triggerName": "beforeDelete",
+    "url": "https://api.example.com/Scores/beforeDelete"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -403,18 +436,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions/baz

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/functions/baz', json.dumps(
-    {"url":"https://api.example.com/_baz"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/functions/baz', json.dumps({
+    "url":"https://api.example.com/_baz"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -440,18 +476,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions/bar

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/functions/bar', json.dumps(
-      {"url":"https://api.example.com/_bar"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/functions/bar', json.dumps({
+    "url": "https://api.example.com/_bar"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -478,18 +517,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers/Game/beforeSave

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/triggers/Game/beforeSave', json.dumps(
-      {"url": "https://api.example.com/Game/_beforeSave"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/triggers/Game/beforeSave', json.dumps({
+    "url": "https://api.example.com/Game/_beforeSave"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -519,18 +561,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers/Tournament/beforeDelete

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/triggers/Tournament/beforeDelete', json.dumps(
-      {"url": "https://api.example.com/Scores/beforeDelete"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/triggers/Tournament/beforeDelete', json.dumps({
+    "url": "https://api.example.com/Scores/beforeDelete"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -558,18 +603,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions/foo

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/functions/foo', json.dumps(
-      {"__op": "Delete"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/functions/foo', json.dumps({
+    "__op": "Delete"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -592,18 +640,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/functions/sendMessage

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/functions/sendMessage', json.dumps(
-      {"__op": "Delete"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/functions/sendMessage', json.dumps({
+    "__op": "Delete"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -626,18 +677,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers/Game/beforeSave

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/triggers/Game/beforeSave', json.dumps(
-      {"__op": "Delete"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/triggers/Game/beforeSave', json.dumps({
+    "__op": "Delete"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -660,18 +714,21 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/hooks/triggers/Tournament/beforeDelete

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/hooks/triggers/Tournament/beforeDelete', json.dumps(
-      {"__op": "Delete"}
-      ), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/hooks/triggers/Tournament/beforeDelete', json.dumps({
+    "__op": "Delete"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/objects.md b/_includes/rest/objects.md index 15d46952e..3239da66a 100644 --- a/_includes/rest/objects.md +++ b/_includes/rest/objects.md @@ -6,7 +6,7 @@ Storing data through the Parse REST API is built around a JSON encoding of the o For example, let's say you're tracking high scores for a game. A single object could contain: -```json +```jsonc { "score": 1337, "playerName": "Sean Plott", @@ -20,13 +20,13 @@ Each object has a class name that you can use to distinguish different sorts of When you retrieve objects from Parse, some fields are automatically added: `createdAt`, `updatedAt`, and `objectId`. These field names are reserved, so you cannot set them yourself. The object above could look like this when retrieved: -```json +```jsonc { "score": 1337, "playerName": "Sean Plott", "cheatMode": false, - "createdAt": "2011-08-20T02:06:57.931Z", - "updatedAt": "2011-08-20T02:06:57.931Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "Ed1nuqPvcm" } ``` @@ -66,18 +66,21 @@ To create a new object on Parse, send a POST request to the class URL containing https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/classes/GameScore', json.dumps({
-       "score": 1337,
-       "playerName": "Sean Plott",
-       "cheatMode": False
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "score": 1337,
+    "playerName": "Sean Plott",
+    "cheatMode": False
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 results = json.loads(connection.getresponse().read())
 print results
 
@@ -92,9 +95,9 @@ Location: https://https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore/Ed1nuqPvcm', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing all the user-provided fields, plus the `createdAt`, `updatedAt`, and `objectId` fields: -```json +```jsonc { "score": 1337, "playerName": "Sean Plott", @@ -134,8 +140,8 @@ The response body is a JSON object containing all the user-provided fields, plus "pwnage", "flying" ], - "createdAt": "2011-08-20T02:06:57.931Z", - "updatedAt": "2011-08-20T02:06:57.931Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "Ed1nuqPvcm" } ``` @@ -152,16 +158,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"include":"game"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"include": "game"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore/Ed1nuqPvcm?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -179,16 +189,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"include":"game","readPreference":"SECONDARY","includeReadPreference":"SECONDARY_PREFERRED"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"include": "game", "readPreference": "SECONDARY", "includeReadPreference": "SECONDARY_PREFERRED"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore/Ed1nuqPvcm?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -208,26 +222,29 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "score": 73453
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "score": 73453
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing just an `updatedAt` field with the timestamp of the update. -```json +```jsonc { - "updatedAt": "2011-08-21T18:02:52.248Z" + "updatedAt": "2022-01-01T12:23:45.678Z" } ``` @@ -245,21 +262,24 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "score": {
-         "__op": "Increment",
-         "amount": 1
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "score": {
+        "__op": "Increment",
+        "amount": 1
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -275,21 +295,24 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "score": {
-         "__op": "Increment",
-         "amount": -1
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "score": {
+        "__op": "Increment",
+        "amount": -1
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -313,24 +336,27 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "skills": {
-         "__op": "AddUnique",
-         "objects": [
-           "flying",
-           "kungfu"
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "skills": {
+        "__op": "AddUnique",
+        "objects": [
+            "flying",
+            "kungfu"
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -348,27 +374,30 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "opponents": {
-         "__op": "AddRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "Player",
-             "objectId": "Vx4nudeWn"
-           }
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "opponents": {
+        "__op": "AddRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "Player",
+                "objectId": "Vx4nudeWn"
+            }
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -384,27 +413,30 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "opponents": {
-         "__op": "RemoveRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "Player",
-             "objectId": "Vx4nudeWn"
-           }
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "opponents": {
+        "__op": "RemoveRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "Player",
+                "objectId": "Vx4nudeWn"
+            }
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -420,15 +452,18 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/classes/GameScore/Ed1nuqPvcm', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -444,20 +479,23 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/classes/GameScore/Ed1nuqPvcm', json.dumps({
-       "opponents": {
-         "__op": "Delete"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "opponents": {
+        "__op": "Delete"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -496,44 +534,47 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/batch

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/batch', json.dumps({
-       "requests": [
-         {
-           "method": "POST",
-           "path": "/parse/classes/GameScore",
-           "body": {
-             "score": 1337,
-             "playerName": "Sean Plott"
-           }
-         },
-         {
-           "method": "POST",
-           "path": "/parse/classes/GameScore",
-           "body": {
-             "score": 1338,
-             "playerName": "ZeroCool"
-           }
-         }
-       ]
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "requests": [
+        {
+            "method": "POST",
+            "path": "/parse/classes/GameScore",
+            "body": {
+                "score": 1337,
+                "playerName": "Sean Plott"
+            }
+        },
+        {
+            "method": "POST",
+            "path": "/parse/classes/GameScore",
+            "body": {
+                "score": 1338,
+                "playerName": "ZeroCool"
+            }
+        }
+    ]
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response from batch will be a list with the same number of elements as the input list. Each item in the list with be a dictionary with either the `success` or `error` field set. The value of `success` will be the normal response to the equivalent REST command: -```json +```jsonc { "success": { - "createdAt": "2012-06-15T16:59:11.276Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "YAfSAWwXbL" } } @@ -541,7 +582,7 @@ The response from batch will be a list with the same number of elements as the i The value of `error` will be an object with a numeric `code` and `error` string: -```json +```jsonc { "error": { "code": 101, @@ -576,30 +617,33 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/batch

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/batch', json.dumps({
-       "requests": [
-         {
-           "method": "PUT",
-           "path": "/parse/classes/GameScore/Ed1nuqPvcm",
-           "body": {
-             "score": 999999
-           }
-         },
-         {
-           "method": "DELETE",
-           "path": "/parse/classes/GameScore/Cpl9lrueY5"
-         }
-       ]
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "requests": [
+        {
+            "method": "PUT",
+            "path": "/parse/classes/GameScore/Ed1nuqPvcm",
+            "body": {
+                "score": 999999
+            }
+        },
+        {
+            "method": "DELETE",
+            "path": "/parse/classes/GameScore/Cpl9lrueY5"
+        }
+    ]
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -622,10 +666,10 @@ So far we have only used values that can be encoded with standard JSON. The Pars The `Date` type contains a field `iso` which contains a UTC timestamp stored in ISO 8601 format with millisecond precision: `YYYY-MM-DDTHH:MM:SS.MMMZ`. -```json +```jsonc { "__type": "Date", - "iso": "2011-08-21T18:02:52.249Z" + "iso": "2022-01-01T12:23:45.678Z" } ``` @@ -637,33 +681,37 @@ curl -X GET \ -H "X-Parse-Application-Id: ${APPLICATION_ID}" \ -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \ -G \ - --data-urlencode 'where={"createdAt":{"$gte":{"__type":"Date","iso":"2011-08-21T18:02:52.249Z"}}}' \ + --data-urlencode 'where={"createdAt":{"$gte":{"__type":"Date","iso":"2022-01-01T12:23:45.678Z"}}}' \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "createdAt": {
-         "$gte": {
-           "__type": "Date",
-           "iso": "2011-08-21T18:02:52.249Z"
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "createdAt": {
+        "$gte": {
+            "__type": "Date",
+            "iso": "2022-01-01T12:23:45.678Z"
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The `Pointer` type is used when mobile code sets another Parse `Object` as the value of another object. It contains the `className` and `objectId` of the referred-to value. -```json +```jsonc { "__type": "Pointer", "className": "GameScore", @@ -675,7 +723,7 @@ Note that the built-in `User`, `Role`, and `Installation` classes are prefixed b The `Relation` type is used for many-to-many relations. It has a `className` that is the class name of the target objects. -```json +```jsonc { "__type": "Relation", "className": "GameScore" @@ -686,7 +734,7 @@ When querying, `Relation` objects behave like arrays of Pointers. Any operation We do not recommend storing large pieces of binary data like images or documents on a Parse object. To store more, we recommend you use `File`. You may associate a [previously uploaded file](#files) using the `File` type. -```json +```jsonc { "__type": "File", "name": "...profile.png" diff --git a/_includes/rest/push-notifications.md b/_includes/rest/push-notifications.md index 22dc9c830..88114096c 100644 --- a/_includes/rest/push-notifications.md +++ b/_includes/rest/push-notifications.md @@ -43,22 +43,25 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/installations

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/installations', json.dumps({
-       "deviceType": "ios",
-       "deviceToken": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
-       "channels": [
-         ""
-       ]
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "deviceType": "ios",
+    "deviceToken": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
+    "channels": [
+        ""
+    ]
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -71,9 +74,9 @@ Location: https://https://YOUR.PARSE-SERVER.HERE/parse/installations

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/installations', json.dumps({
-       "deviceType": "android",
-       "pushType": "gcm",
-       "deviceToken": "APA91bFMvbrGg4cp3KUV_7dhU1gmwE_...",
-       "channels": [
-         ""
-       ]
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "deviceType": "android",
+    "pushType": "gcm",
+    "deviceToken": "APA91bFMvbrGg4cp3KUV_7dhU1gmwE_...",
+    "channels": [
+        ""
+    ]
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -135,29 +141,32 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/installations/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/installations/mrmBZvsErB', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing all the user-provided fields, plus the `createdAt`, `updatedAt`, and `objectId` fields: -```json +```jsonc { "deviceType": "ios", "deviceToken": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", "channels": [ "" ], - "createdAt": "2012-04-28T17:41:09.106Z", - "updatedAt": "2012-04-28T17:41:09.106Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "mrmBZvsErB" } ``` @@ -183,23 +192,26 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/installations/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/installations/mrmBZvsErB', json.dumps({
-       "deviceType": "ios",
-       "deviceToken": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
-       "channels": [
-         "",
-         "foo"
-       ]
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "deviceType": "ios",
+    "deviceToken": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
+    "channels": [
+        "",
+        "foo"
+    ]
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -219,21 +231,24 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/installations

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/installations', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The return value is a JSON object that contains a results field with a JSON array that lists the users. -```json +```jsonc { "results": [ { @@ -242,8 +257,8 @@ The return value is a JSON object that contains a results field with a JSON arra "channels": [ "" ], - "createdAt": "2012-04-28T17:41:09.106Z", - "updatedAt": "2012-04-28T17:41:09.106Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "mrmBZvsErB" }, { @@ -252,8 +267,8 @@ The return value is a JSON object that contains a results field with a JSON arra "channels": [ "" ], - "createdAt": "2012-04-30T01:52:57.975Z", - "updatedAt": "2012-04-30T01:52:57.975Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "sGlvypFQcO" } ] @@ -275,15 +290,18 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/installations/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/installations/mrmBZvsErB', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -317,20 +335,23 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/installations/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/installations/mrmBZvsErB', json.dumps({
-       "channels": [
-         "Giants"
-       ]
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "channels": [
+        "Giants"
+    ]
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -362,24 +383,27 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "channels": [
-         "Giants",
-         "Mets"
-       ],
-       "data": {
-         "alert": "The Giants won against the Mets 2-3."
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "channels": [
+        "Giants",
+        "Mets"
+    ],
+    "data": {
+        "alert": "The Giants won against the Mets 2-3."
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -407,20 +431,23 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/installations/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/installations/mrmBZvsErB', json.dumps({
-       "scores": True,
-       "gameResults": True,
-       "injuryReports": True
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "scores": True,
+    "gameResults": True,
+    "injuryReports": True
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -442,22 +469,25 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/installations/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/installations/mrmBZvsErB', json.dumps({
-       "user": {
-         "__type": "Pointer",
-         "className": "_User",
-         "objectId": "vmRZXZ1Dvo"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "user": {
+        "__type": "Pointer",
+        "className": "_User",
+        "objectId": "vmRZXZ1Dvo"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -482,23 +512,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "injuryReports": True
-       },
-       "data": {
-         "alert": "Willie Hayes injured by own pop fly."
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "injuryReports": True
+    },
+    "data": {
+        "alert": "Willie Hayes injured by own pop fly."
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -522,24 +555,27 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "channels": "Giants",
-         "scores": True
-       },
-       "data": {
-         "alert": "The Giants scored a run! The score is now 2-2."
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "channels": "Giants",
+        "scores": True
+    },
+    "data": {
+        "alert": "The Giants scored a run! The score is now 2-2."
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -573,37 +609,40 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "user": {
-           "$inQuery":{
-              "where":{
-                "location":{
-                  "$nearSphere":{
-                    "__type":"GeoPoint",
-                      "latitude":51.252437591552734,
-                      "longitude":-1.6038470268249512
-                    },
-                  "$maxDistanceInMiles":1.0
-                }
-              },
-              "className":"_User"
+    "where": {
+        "user": {
+            "$inQuery": {
+                "where": {
+                    "location": {
+                        "$nearSphere": {
+                            "__type": "GeoPoint",
+                            "latitude": 51.252437591552734,
+                            "longitude": -1.6038470268249512
+                        },
+                        "$maxDistanceInMiles": 1.0
+                    }
+                },
+                "className": "_User"
             }
-         }
-       },
-       "data": {
-         "alert": "Free hotdogs at the Parse concession stand!"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+        }
+    },
+    "data": {
+        "alert": "Free hotdogs at the Parse concession stand!"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -649,26 +688,29 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "channels": [
-         "Mets"
-       ],
-       "data": {
-         "alert": "The Mets scored! The game is now tied 1-1.",
-         "badge": "Increment",
-         "sound": "cheering.caf",
-         "title": "Mets Score!"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "channels": [
+        "Mets"
+    ],
+    "data": {
+        "alert": "The Mets scored! The game is now tied 1-1.",
+        "badge": "Increment",
+        "sound": "cheering.caf",
+        "title": "Mets Score!"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -678,26 +720,29 @@ It is also possible to specify your own data in this dictionary. As explained in

 

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "channels": [
-         "Indians"
-       ],
-       "data": {
-         "action": "com.example.UPDATE_STATUS",
-         "alert": "Ricky Vaughn was injured during the game last night!",
-         "name": "Vaughn",
-         "newsItem": "Man bites dog"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "channels": [
+        "Indians"
+    ],
+    "data": {
+        "action": "com.example.UPDATE_STATUS",
+        "alert": "Ricky Vaughn was injured during the game last night!",
+        "name": "Vaughn",
+        "newsItem": "Man bites dog"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -722,21 +767,24 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "expiration_time": "2015-03-19T22:05:08Z",
-       "data": {
-         "alert": "Season tickets on sale until March 19, 2015"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "expiration_time": "2015-03-19T22:05:08Z",
+    "data": {
+        "alert": "Season tickets on sale until March 19, 2015"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -758,22 +806,25 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "push_time": "2015-03-13T22:05:08Z",
-       "expiration_interval": 518400,
-       "data": {
-         "alert": "Season tickets on sale until March 19, 2015"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "push_time": "2015-03-13T22:05:08Z",
+    "expiration_interval": 518400,
+    "data": {
+        "alert": "Season tickets on sale until March 19, 2015"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -800,23 +851,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "deviceType": "android"
-       },
-       "data": {
-         "alert": "Your suitcase has been filled with tiny robots!"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "deviceType": "android"
+    },
+    "data": {
+        "alert": "Your suitcase has been filled with tiny robots!"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -837,23 +891,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "deviceType": "ios"
-       },
-       "data": {
-         "alert": "Your suitcase has been filled with tiny apples!"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "deviceType": "ios"
+    },
+    "data": {
+        "alert": "Your suitcase has been filled with tiny apples!"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -874,23 +931,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "deviceType": "winrt"
-       },
-       "data": {
-         "alert": "Your suitcase has been filled with tiny glass!"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "deviceType": "winrt"
+    },
+    "data": {
+        "alert": "Your suitcase has been filled with tiny glass!"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -911,23 +971,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "deviceType": "winphone"
-       },
-       "data": {
-         "alert": "Your suitcase is very hip; very metro."
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "deviceType": "winphone"
+    },
+    "data": {
+        "alert": "Your suitcase is very hip; very metro."
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -953,24 +1016,27 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/push

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/push', json.dumps({
-       "where": {
-         "user_id": "user_123"
-       },
-       "push_time": "2015-03-19T12:00:00Z",
-       "data": {
-         "alert": "You previously created a reminder for the game today"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "where": {
+        "user_id": "user_123"
+    },
+    "push_time": "2015-03-19T12:00:00Z",
+    "data": {
+        "alert": "You previously created a reminder for the game today"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1007,21 +1073,24 @@ curl -X POST \ https://api.parse.com/1/push

-import json,httplib
-connection = httplib.HTTPSConnection('api.parse.com', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('api.parse.com', 443)
 connection.connect()
 connection.request('POST', '/1/push', json.dumps({
-       "data": {
-         "alert": "The default alert for all languages",
-         "alert-fr": "Une alerte en français"
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "data": {
+        "alert": "The default alert for all languages",
+        "alert-fr": "Une alerte en français"
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/queries.md b/_includes/rest/queries.md index a2acbb84c..0db42acb2 100644 --- a/_includes/rest/queries.md +++ b/_includes/rest/queries.md @@ -12,36 +12,39 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The return value is a JSON object that contains a `results` field with a JSON array that lists the objects. -```json +```jsonc { "results": [ { "playerName": "Jang Min Chul", - "updatedAt": "2011-08-19T02:24:17.787Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "cheatMode": false, - "createdAt": "2011-08-19T02:24:17.787Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "A22v5zRAgd", "score": 80075 }, { "playerName": "Sean Plott", - "updatedAt": "2011-08-21T18:02:52.248Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "cheatMode": false, - "createdAt": "2011-08-20T02:06:57.931Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "Ed1nuqPvcm", "score": 73453 } @@ -63,19 +66,23 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "playerName": "Sean Plott",
-       "cheatMode": False
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "playerName": "Sean Plott",
+    "cheatMode": False
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -109,21 +116,25 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "score": {
-         "$gte": 1000,
-         "$lte": 3000
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "score": {
+        "$gte": 1000,
+        "$lte": 3000
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -139,26 +150,30 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "score": {
-         "$in": [
-           1,
-           3,
-           5,
-           7,
-           9
-         ]
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "score": {
+        "$in": [
+            1,
+            3,
+            5,
+            7,
+            9
+        ]
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -182,24 +197,28 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "playerName": {
-         "$nin": [
-           "Jonathan Walsh",
-           "Dario Wunsch",
-           "Shawn Simon"
-         ]
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "playerName": {
+        "$nin": [
+            "Jonathan Walsh",
+            "Dario Wunsch",
+            "Shawn Simon"
+        ]
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -215,20 +234,24 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "score": {
-         "$exists": True
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "score": {
+        "$exists": True
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -244,20 +267,24 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "score": {
-         "$exists": False
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "score": {
+        "$exists": False
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -273,30 +300,34 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/_User

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "hometown": {
-         "$select": {
-           "query": {
-             "className": "Team",
-             "where": {
-               "winPct": {
-                 "$gt": 0.5
-               }
-             }
-           },
-           "key": "city"
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "hometown": {
+        "$select": {
+            "query": {
+                "className": "Team",
+                "where": {
+                    "winPct": {
+                        "$gt": 0.5
+                    }
+                }
+            },
+            "key": "city"
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/_User?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -323,16 +354,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"order":"score"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"order": "score"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -348,16 +383,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"order":"-score"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"order": "-score"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -373,16 +412,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"order":"score,-name"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"order": "score, -name"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -399,20 +442,26 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"limit":200,"skip":400})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"limit": 200, "skip": 400})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
-You can restrict the fields returned by passing `keys` or `excludeKeys` a comma-separated list. To retrieve documents that contain only the `score` and `playerName` fields (and also special built-in fields such as `objectId`, `createdAt`, and `updatedAt`): +You can restrict the fields returned by passing `keys` or `excludeKeys` as an [array](#arrays). To retrieve documents that contain only the `score` and `playerName` fields (and also special built-in fields such as `objectId`, `createdAt`, and `updatedAt`): + +* On Parse Server <5.0.0 pass a comma-delimited string, e.g. `"score,playerName"` instead of an array for `keys` and `excludeKeys`.

@@ -424,16 +473,20 @@ curl -X GET \
   https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore
 

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"keys":"score,playerName"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"keys": "[score, playerName]"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -449,16 +502,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore/Ed1nuqPvcm

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"excludeKeys":"playerName"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"excludeKeys": "playerName"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore/Ed1nuqPvcm?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -486,29 +543,32 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({
-    "where":json.dumps({
-      "playerName": {
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "playerName": {
         "$nin": [
-          "Jonathan Walsh",
-          "Dario Wunsch",
-          "Shawn Simon"
+            "Jonathan Walsh",
+            "Dario Wunsch",
+            "Shawn Simon"
         ]
-      }
-    }),
-    "order":"score,-name",
-    "limit":200,
-    "skip":400,
-    "keys":"score,playerName"})
+    }
+}),
+"order": "score,-name",
+"limit": 200,
+"skip": 400,
+"keys": "score,playerName"})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -527,18 +587,22 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/RandomObject

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "arrayKey": 2
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "arrayKey": 2
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/RandomObject?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -554,24 +618,28 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/RandomObject

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "arrayKey": {
-         "$all": [
-           2,
-           3,
-           4
-         ]
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "arrayKey": {
+        "$all": [
+            2,
+            3,
+            4
+        ]
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/RandomObject?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -591,20 +659,24 @@ curl -X GET \

 # Finds barbecue sauces that start with "Big Daddy"
-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "name": {
-         "$regex": "^Big Daddy"
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "name": {
+        "$regex": "^Big Daddy"
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/BarbecueSauce?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -647,24 +719,28 @@ curl -X GET \

 # Finds barbecue sauces that contains "Daddy"
-import json,httplib,urllib
-connection = httplib.HTTPSConnection('api.parse.com', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "name": {
-         "$text": {
-          "$search": {
-           "$term": "Daddy"
-          }
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('api.parse.com', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "name": {
+        "$text": {
+            "$search": {
+                "$term": "Daddy"
+            }
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/1/classes/BarbecueSauce?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -684,27 +760,30 @@ curl -X GET \

 # Finds string that contains "Daddy" ordered by relevance
-import json,httplib,urllib
-connection = httplib.HTTPSConnection('api.parse.com', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "name": {
-         "$text": {
-          "$search": {
-           "$term": "Daddy"
-          }
-         }
-       }
-     }),
-     "order":"$score",
-     "keys":"$score",
-     })
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('api.parse.com', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "name": {
+        "$text": {
+            "$search": {
+                "$term": "Daddy"
+            }
+        }
+    }
+}),
+"order": "$score",
+"keys": "$score"})
 connection.connect()
 connection.request('GET', '/1/classes/BarbecueSauce?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -724,22 +803,26 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Comment

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "post": {
-         "__type": "Pointer",
-         "className": "Post",
-         "objectId": "8TOXdXf3tz"
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "post": {
+        "__type": "Pointer",
+        "className": "Post",
+        "objectId": "8TOXdXf3tz"
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/Comment?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -755,27 +838,31 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Comment

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "post": {
-         "$inQuery": {
-           "where": {
-             "image": {
-               "$exists": True
-             }
-           },
-           "className": "Post"
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "post": {
+        "$inQuery": {
+            "where": {
+                "image": {
+                    "$exists": True
+                }
+            },
+            "className": "Post"
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/Comment?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -791,27 +878,31 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Comment

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "post": {
-         "$notInQuery": {
-           "where": {
-             "image": {
-               "$exists": True
-             }
-           },
-           "className": "Post"
-         }
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "post": {
+        "$notInQuery": {
+            "where": {
+                "image": {
+                    "$exists": True
+                }
+            },
+            "className": "Post"
+        }
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/Comment?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -827,25 +918,29 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/users

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "$relatedTo": {
-         "object": {
-           "__type": "Pointer",
-           "className": "Post",
-           "objectId": "8TOXdXf3tz"
-         },
-         "key": "likes"
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "$relatedTo": {
+        "object": {
+            "__type": "Pointer",
+            "className": "Post",
+            "objectId": "8TOXdXf3tz"
+        },
+        "key": "likes"
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/users?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -863,22 +958,26 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Comment

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"order":"-createdAt","limit":10,"include":"post"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"order": "-createdAt", "limit": 10, "include": "post"})
 connection.connect()
 connection.request('GET', '/parse/classes/Comment?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
Instead of being represented as a `Pointer`, the `post` field is now expanded into the whole object. `__type` is set to `Object` and `className` is provided as well. For example, a `Pointer` to a `Post` could be represented as: -```json +```jsonc { "__type": "Pointer", "className": "Post", @@ -888,13 +987,13 @@ Instead of being represented as a `Pointer`, the `post` field is now expanded in When the query is issued with an `include` parameter for the key holding this pointer, the pointer will be expanded to: -```json +```jsonc { "__type": "Object", "className": "Post", "objectId": "8TOXdXf3tz", - "createdAt": "2011-12-06T20:59:34.428Z", - "updatedAt": "2011-12-06T20:59:34.428Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "otherFields": "willAlsoBeIncluded" } ``` @@ -913,16 +1012,20 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Comment

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"order":"-createdAt","limit":10,"include":"post.author"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"order": "-createdAt", "limit": 10, "include": "post.author"})
 connection.connect()
 connection.request('GET', '/parse/classes/Comment?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -946,24 +1049,30 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "playerName": "Jonathan Walsh"
-     }),"count":1,"limit":0})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "playerName": "Jonathan Walsh"
+}),
+"count": 1,
+"limit": 0})
 connection.connect()
 connection.request('GET', '/parse/classes/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
Since this requests a count as well as limiting to zero results, there will be a count but no results in the response. -```json +```jsonc { "results": [], "count": 1337 @@ -986,29 +1095,33 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Player

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "$or": [
-         {
-           "wins": {
-             "$gt": 150
-           }
-         },
-         {
-           "wins": {
-             "$lt": 5
-           }
-         }
-       ]
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "$or": [
+        {
+            "wins": {
+                "$gt": 150
+            }
+        },
+        {
+            "wins": {
+                "$lt": 5
+            }
+        }
+    ]
+})})
 connection.connect()
 connection.request('GET', '/parse/classes/Player?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1033,17 +1146,21 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/aggregate/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"distinct":"score"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"distinct": "score"})
 connection.connect()
 connection.request('GET', '/parse/aggregate/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1060,19 +1177,24 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/aggregate/GameScore

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"where":json.dumps({
-       "playerName": "Sean Plott"
-     }),"distinct":"score"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
+    "playerName": "Sean Plott"
+}),
+"distinct": "score"})
 connection.connect()
 connection.request('GET', '/parse/aggregate/GameScore?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1103,22 +1225,27 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/aggregate/Player

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"group":json.dumps({
-       "objectId": null,
-       "total": {
-        "$sum":"$score"
-       }
-     }),"distinct":"score"})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"group": json.dumps({
+    "objectId": null,
+    "total": {
+        "$sum": "$score"
+    }
+}),
+"distinct": "score"})
 connection.connect()
 connection.request('GET', '/parse/aggregate/Player?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1135,19 +1262,23 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/aggregate/Player

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"project":json.dumps({
-       "score": 1
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"project": json.dumps({
+    "score": 1
+})})
 connection.connect()
 connection.request('GET', '/parse/aggregate/Player?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1164,21 +1295,25 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/aggregate/Player

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"match":json.dumps({
-       "score": {
-        "$gt":15
-       }
-     })})
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"match": json.dumps({
+    "score": {
+        "$gt": 15
+    }
+})})
 connection.connect()
 connection.request('GET', '/parse/aggregate/Player?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -1202,32 +1337,34 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/classes/Comment

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({
-  "where":json.dumps({
+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"where": json.dumps({
     "post": {
-      "$inQuery": {
-        "where": {
-          "image": {
-            "$exists": True
-          }
-        },
-        "className": "Post"
-      }
+        "$inQuery": {
+            "where": {
+                "image": {
+                    "$exists": True
+                }
+            },
+            "className": "Post"
+        }
     }
-  }),
-  "include":"post",
-  "readPreference":"SECONDARY",
-  "includeReadPreference":"SECONDARY_PREFERRED",
-  "subqueryReadPreference":"NEAREST"
-})
+}),
+"include": "post",
+"readPreference": "SECONDARY",
+"includeReadPreference": "SECONDARY_PREFERRED",
+"subqueryReadPreference": "NEAREST"})
 connection.connect()
 connection.request('GET', '/parse/classes/Comment?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/quick-reference.md b/_includes/rest/quick-reference.md index 84ab29f83..8047d1446 100644 --- a/_includes/rest/quick-reference.md +++ b/_includes/rest/quick-reference.md @@ -152,7 +152,7 @@ The response format for all requests is a JSON object. Whether a request succeeded is indicated by the HTTP status code. A 2xx status code indicates success, whereas a 4xx status code indicates failure. When a request fails, the response body is still JSON, but always contains the fields `code` and `error` which you can inspect to use for debugging. For example, trying to save an object with invalid keys will return the message: -```json +```jsonc { "code": 105, "error": "invalid field name: bl!ng" diff --git a/_includes/rest/roles.md b/_includes/rest/roles.md index 096d23504..b3984c9b8 100644 --- a/_includes/rest/roles.md +++ b/_includes/rest/roles.md @@ -35,23 +35,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/roles

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/roles', json.dumps({
-       "name": "Moderators",
-       "ACL": {
-         "*": {
-           "read": True
-         }
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "name": "Moderators",
+    "ACL": {
+        "*": {
+            "read": True
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -94,43 +97,46 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/roles

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/roles', json.dumps({
-       "name": "Moderators",
-       "ACL": {
-         "*": {
-           "read": True
-         }
-       },
-       "roles": {
-         "__op": "AddRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "_Role",
-             "objectId": "Ed1nuqPvc"
-           }
-         ]
-       },
-       "users": {
-         "__op": "AddRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "_User",
-             "objectId": "8TOXdXf3tz"
-           }
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "name": "Moderators",
+    "ACL": {
+        "*": {
+            "read": True
+        }
+    },
+    "roles": {
+        "__op": "AddRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "_Role",
+                "objectId": "Ed1nuqPvc"
+            }
+        ]
+    },
+    "users": {
+        "__op": "AddRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "_User",
+                "objectId": "8TOXdXf3tz"
+            }
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -143,9 +149,9 @@ Location: https://https://YOUR.PARSE-SERVER.HERE/parse/roles/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/roles/mrmBZvsErB', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing all of the fields on the role: -```json +```jsonc { - "createdAt": "2012-04-28T17:41:09.106Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "mrmBZvsErB", - "updatedAt": "2012-04-28T17:41:09.106Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "ACL": { "*": { "read": true @@ -228,32 +237,35 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/roles/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/roles/mrmBZvsErB', json.dumps({
-       "users": {
-         "__op": "AddRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "_User",
-             "objectId": "8TOXdXf3tz"
-           },
-           {
-             "__type": "Pointer",
-             "className": "_User",
-             "objectId": "g7y9tkhB7O"
-           }
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "users": {
+        "__op": "AddRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "_User",
+                "objectId": "8TOXdXf3tz"
+            },
+            {
+                "__type": "Pointer",
+                "className": "_User",
+                "objectId": "g7y9tkhB7O"
+            }
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -280,27 +292,30 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/roles/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/roles/mrmBZvsErB', json.dumps({
-       "roles": {
-         "__op": "RemoveRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "_Role",
-             "objectId": "Ed1nuqPvc"
-           }
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "roles": {
+        "__op": "RemoveRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "_Role",
+                "objectId": "Ed1nuqPvc"
+            }
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -319,15 +334,18 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/roles/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/roles/mrmBZvsErB', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -342,16 +360,19 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/roles/mrmBZvsErB

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/roles/mrmBZvsErB', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -362,7 +383,7 @@ In addition to per-user permissions [as described above](#access-control-lists), For example, to restrict an object to be readable by anyone in the "Members" role and writable by its creator and anyone in the "Moderators" role, you would specify an ACL like this: -```json +```jsonc { "8TOXdXf3tz": { "write": true @@ -406,25 +427,28 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/roles/<ModeratorsRoleObjectId>

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/roles/<ModeratorsRoleObjectId>', json.dumps({
-       "roles": {
-         "__op": "AddRelation",
-         "objects": [
-           {
-             "__type": "Pointer",
-             "className": "_Role",
-             "objectId": "<AdministratorsRoleObjectId>"
-           }
-         ]
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "roles": {
+        "__op": "AddRelation",
+        "objects": [
+            {
+                "__type": "Pointer",
+                "className": "_Role",
+                "objectId": "<AdministratorsRoleObjectId>"
+            }
+        ]
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/schemas.md b/_includes/rest/schemas.md index d617c5234..13ca270ae 100644 --- a/_includes/rest/schemas.md +++ b/_includes/rest/schemas.md @@ -26,22 +26,25 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/schemas

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/schemas', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is JSON containing all the schema information of the app. -```json +```jsonc { "results": [ { @@ -83,16 +86,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/schemas/Game

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/schemas/Game', "", {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -119,18 +125,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/schemas/City

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/schemas/City', json.dumps({
-       "className":"City","fields":{"name":{"type":"String"} }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "className": "City",
+    "fields": {
+        "name": {
+            "type": "String"
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -159,18 +173,31 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/schemas/City

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/schemas/City', json.dumps({
-       "className":"City","fields":{"name":{"type":"String"},"indexes":{"indexName":{"name":1} }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "className": "City",
+    "fields": {
+        "name": {
+            "type": "String"
+        },
+        "indexes": {
+            "indexName": {
+                "name": 1
+            }
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -201,18 +228,31 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/schemas/City

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/schemas/City', json.dumps(
-       "className":"City","fields":{"population":{"type":"Number"},"indexes":{"population_index":{"population":1} }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/schemas/City', json.dumps({
+    "className": "City",
+    "fields": {
+        "population": {
+            "type": "Number"
+        },
+        "indexes": {
+            "population_index": {
+                "population": 1
+            }
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -241,18 +281,31 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/schemas/City

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/schemas/City', json.dumps(
-       "className":"City","fields":{"population":{"__op" : "Delete"},"indexes":{"population_index":{"__op" : "Delete"} }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/schemas/City', json.dumps({
+    "className": "City",
+    "fields": {
+        "population": {
+            "__op": "Delete"
+        },
+        "indexes": {
+            "population_index": {
+                "__op" : "Delete"
+            }
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -270,14 +323,17 @@ curl -X DELETE\ https://YOUR.PARSE-SERVER.HERE/parse/schemas/City

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/schemas/City', "", {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-Master-Key": "${MASTER_KEY}",
-       "Content-Type": "application/json"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
diff --git a/_includes/rest/sessions.md b/_includes/rest/sessions.md index 4ffbb2001..0535e2bde 100644 --- a/_includes/rest/sessions.md +++ b/_includes/rest/sessions.md @@ -2,7 +2,7 @@ Sessions represent an instance of a user logged into a device. Sessions are automatically created when users log in or sign up. They are automatically deleted when users log out. There is one distinct `Session` object for each user-installation pair; if a user issues a login request from a device they're already logged into, that user's previous `Session` object for that Installation is automatically deleted. `Session` objects are stored on Parse in the Session class, and you can view them on the Parse Dashboard Data Browser. We provide a set of APIs to manage `Session` objects in your app. -A `Session` is a subclass of a Parse `Object`, so you can query, update, and delete sessions in the same way that you manipulate normal objects on Parse. Because the Parse Cloud automatically creates sessions when you log in or sign up users, you should not manually create `Session` objects unless you are building a "Parse for IoT" app (e.g. Arduino or Embedded C). Deleting a `Session` will log the user out of the device that is currently using this session's token. +A `Session` is a subclass of a Parse `Object`, so you can query, update, and delete sessions in the same way that you manipulate normal objects on Parse. Because the Parse Cloud automatically creates sessions when you log in or sign up users, you should not manually create `Session` objects unless you are building an IoT app (e.g. Arduino or Embedded C). Deleting a `Session` will log the user out of the device that is currently using this session's token. Unlike other Parse objects, the `Session` class does not have Cloud Code triggers. So you cannot register a `beforeSave` or `afterSave` handler for the Session class. @@ -17,7 +17,7 @@ The `Session` object has these special fields: * `authProvider` could have values: `password`, `anonymous`, `facebook`, or `twitter`. * `restricted` (readonly): Boolean for whether this session is restricted. * Restricted sessions do not have write permissions on `User`, `Session`, and `Role` classes on Parse. Restricted sessions also cannot read unrestricted sessions. - * All sessions that the Parse Cloud automatically creates during user login/signup will be unrestricted. All sessions that the developer manually creates by saving a new `Session` object from the client (only needed for "Parse for IoT" apps) will be restricted. + * All sessions that the Parse Cloud automatically creates during user login/signup will be unrestricted. All sessions that the developer manually creates by saving a new `Session` object from the client (only needed for IoT apps) will be restricted. * `expiresAt` (readonly): Approximate UTC date when this `Session` object will be automatically deleted. You can configure session expiration settings (either 1-year inactivity expiration or no expiration) in your app's Parse Dashboard settings page. * `installationId` (can be set only once): String referring to the `Installation` where the session is logged in from. For the REST API, you can set this by passing the `X-Parse-Installation-Id` header on login and signup requests. All special fields except `installationId` can only be set automatically by the Parse Cloud. You can add custom fields onto `Session` objects, but please keep in mind that any logged-in device (with session token) can read other sessions that belong to the same user (unless you disable Class-Level Permissions, see below). @@ -32,53 +32,6 @@ With revocable sessions, your current session token could become invalid if its For mobile apps and websites, you should not create `Session` objects manually. Instead, you should call GET /parse/login and POST /parse/users (signup), which will automatically generate a `Session` object in the Parse Cloud. The session token for this automatically-created session will be sent back on the login and signup response. Same for Facebook/Twitter login and signup requests. -In "Parse for IoT" apps (e.g. Arduino or Embedded C), you may want to programmatically create a restricted session that can be transferred to an IoT device. In order to do this, you must first log in normally to obtain an unrestricted session token. Then, you can create a restricted session by providing this unrestricted session token: - -
-

-curl -X POST \
-  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
-  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
-  -H "X-Parse-Session-Token: r:pnktnjyb996sj4p156gjtp4im" \
-  -H "Content-Type: application/json" \
-  -d '{"customField":"value"}' \
-  https://YOUR.PARSE-SERVER.HERE/parse/sessions
-
-

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-connection.connect()
-connection.request('POST', '/parse/sessions', json.dumps({
-       "customField": "value"
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im",
-       "Content-Type": "application/json"
-     })
-result = json.loads(connection.getresponse().read())
-print result
-
-
- -In the above code, `r:pnktnjyb996sj4p156gjtp4im` is the unrestricted session token from the original user login. - -The response looks like: - -

-{
-  "createdAt": "2015-03-25T18:21:52.883Z",
-  "createdWith": {
-    "action": "create"
-  },
-  "objectId": "pla1TY9co3",
-  "restricted": true,
-  "sessionToken": "r:aVrtljyb7E8xKo9256gfvp4n2"
-}
-
- -At this point, you can pass the session token `r:aVrtljyb7E8xKo9256gfvp4n2` to an IoT device so that it can access the current user's data. - ## Retrieving Sessions If you have the session's objectId, you fetch the `Session` object as long as it belongs to the same user as your current session: @@ -92,16 +45,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/sessions/Axy98kq1B09

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/sessions/Axy98kq1B09', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -116,16 +72,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/sessions/me

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/sessions/me', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -144,16 +103,19 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/sessions/Axy98kq1B09

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/logout', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -170,16 +132,19 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/sessions

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/sessions', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -196,16 +161,19 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/logout

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/logout', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -220,16 +188,19 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/sessions/Axy98kq1B09

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/sessions/Axy98kq1B09', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -239,7 +210,7 @@ print result For normal user login with the /parse/login endpoint, the Parse Cloud will set the automatically-created `Session` object's `installationId` to the `X-Parse-Installation-Id` header passed on the login or signup request. Therefore, for these scenarios, you don't need to manually associate the `Session` object with an installation. -The following API is most useful for "Parse for IoT" apps (e.g. Arduino or Embedded C). During IoT device provisioning, the phone typically does not know the `installationId` of the IoT device. The provisioning process typically goes like this: +The following API is most useful for IoT apps (e.g. Arduino or Embedded C). During IoT device provisioning, the phone typically does not know the `installationId` of the IoT device. The provisioning process typically goes like this: 1. Phone creates a restricted session (with blank `installationId`) for the device. 2. IoT device acts as a Wi-Fi software access point. Phone passes this newly-created session's token, along with the Wi-Fi password, to the IoT device. @@ -258,18 +229,20 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/sessions/me

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('PUT', '/parse/sessions/me', json.dumps({
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:aVrtljyb7E8xKo9256gfvp4n2",
-       "Content-Type": "application/json"
-     })
+connection.request('PUT', '/parse/sessions/me', '', {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:aVrtljyb7E8xKo9256gfvp4n2",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -281,23 +254,25 @@ When you log in a user via POST /parse/sessions are always restricted. You cannot manually create an unrestricted sessions using the object creation API. -Restricted sessions are prohibited from creating, modifying, or deleting any data in the `User`, `Session`, and `Role` classes. Restricted session also cannot read unrestricted sessions. Restricted Sessions are useful for "Parse for IoT" devices (e.g Arduino or Embedded C) that may run in a less-trusted physical environment than mobile apps. However, please keep in mind that restricted sessions can still read data on `User`, `Session`, and `Role` classes, and can read/write data in any other class just like a normal session. So it is still important for IoT devices to be in a safe physical environment and ideally use encrypted storage to store the session token. +Restricted sessions are prohibited from creating, modifying, or deleting any data in the `User`, `Session`, and `Role` classes. Restricted session also cannot read unrestricted sessions. Restricted Sessions are useful for IoT devices (e.g Arduino or Embedded C) that may run in a less-trusted physical environment than mobile apps. However, please keep in mind that restricted sessions can still read data on `User`, `Session`, and `Role` classes, and can read/write data in any other class just like a normal session. So it is still important for IoT devices to be in a safe physical environment and ideally use encrypted storage to store the session token. If you want to prevent restricted Sessions from modifying classes other than `User`, `Session`, or `Role`, you can write a Cloud Code `beforeSave` handler for that class:

-Parse.Cloud.beforeSave("MyClass", function(request, response) {
-  Parse.Session.current().then(function(session) {
-    if (session.get('restricted')) {
-      response.error('write operation not allowed');
-    }
-    response.success();
-  });
+Parse.Cloud.beforeSave("MyClass", async request => {
+  const user = request.user;
+  const token = user.getSessionToken(); 
+  const query = new Parse.Query(Parse.Session);
+  query.equalTo('sessionToken', token);
+  const session = await q.first({ useMasterKey: true });
+  if (session.get('restricted')) {
+      throw 'write operation not allowed';
+  }
 });
 
You can configure Class-Level Permissions (CLPs) for the Session class just like other classes on Parse. CLPs restrict reading/writing of sessions via the /parse/sessions API, but do not restrict Parse Cloud's automatic session creation/deletion when users log in, sign up, and log out. We recommend that you disable all CLPs not needed by your app. Here are some common use cases for Session CLPs: * **Find**, **Delete** — Useful for building a UI screen that allows users to see their active session on all devices, and log out of sessions on other devices. If your app does not have this feature, you should disable these permissions. -* **Create** — Useful for "Parse for IoT" apps (e.g. Arduino or Embedded C) that provision restricted user sessions for other devices from the phone app. You should disable this permission when building apps for mobile and web. For "Parse for IoT" apps, you should check whether your IoT device actually needs to access user-specific data. If not, then your IoT device does not need a user session, and you should disable this permission. +* **Create** — Useful for IoT apps (e.g. Arduino or Embedded C) that provision restricted user sessions for other devices from the phone app. You should disable this permission when building apps for mobile and web. For IoT apps, you should check whether your IoT device actually needs to access user-specific data. If not, then your IoT device does not need a user session, and you should disable this permission. * **Get**, **Update**, **Add Field** — Unless you need these operations, you should disable these permissions. diff --git a/_includes/rest/users.md b/_includes/rest/users.md index 025cb6470..2cffd23b6 100644 --- a/_includes/rest/users.md +++ b/_includes/rest/users.md @@ -23,21 +23,24 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/users

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/users', json.dumps({
-       "username": "cooldude6",
-       "password": "p_n7!-e8",
-       "phone": "415-392-0202"
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Revocable-Session": "1",
-       "Content-Type": "application/json"
-     })
+    "username": "cooldude6",
+    "password": "p_n7!-e8",
+    "phone": "415-392-0202"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Revocable-Session": "1",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -50,9 +53,9 @@ Location: https:///parse/login endpoint with `username` and `password` as URL-encoded parameters: +After you allow users to sign up, you need to let them log in to their account with a username and password in the future. To do this, send a POST request to the /parse/login endpoint with `username` and `password` as parameters in the body: +

-curl -X GET \
+curl -X POST \
   -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
   -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
   -H "X-Parse-Revocable-Session: 1" \
-  -G \
-  --data-urlencode 'username=cooldude6' \
-  --data-urlencode 'password=p_n7!-e8' \
+  -H "Content-Type: application/json" \
+  -d '{"username":"cooldude6","password":"p_n7!-e8"}' \
   https://YOUR.PARSE-SERVER.HERE/parse/login
 

-import json,httplib,urllib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
-params = urllib.urlencode({"username":"cooldude6","password":"p_n7!-e8"})
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
-connection.request('GET', '/parse/login?%s' % params, '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Revocable-Session": "1"
-     })
+connection.request('POST', '/parse/login', json.dumps({
+    "username": "cooldude6",
+    "password": "p_n7!-e8"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Revocable-Session": "1",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing all the user-provided fields except `password`. It also contains the `createdAt`, `updatedAt`, `objectId`, and `sessionToken` fields: -```json +```jsonc { "username": "cooldude6", "phone": "415-392-0202", - "createdAt": "2011-11-07T20:58:34.448Z", - "updatedAt": "2011-11-07T20:58:34.448Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "g7y9tkhB7O", "sessionToken": "r:pnktnjyb996sj4p156gjtp4im" } @@ -111,7 +120,7 @@ There are three `emailVerified` states to consider: 2. `false` - at the time the `User` object was last refreshed, the user had not confirmed his or her email address. If `emailVerified` is `false`, consider refreshing the `User` object. 3. _missing_ - the `User` was created when email verification was off or the `User` does not have an `email`. -You can request a verification email to be sent by sending a POST request to /parse/verificationEmailRequest with `email` in the body of the request: +You can request a verification email to be sent by sending a POST request to /parse/verificationEmailRequest with `email` in the body of the request:

@@ -123,18 +132,21 @@ curl -X POST \
   https://YOUR.PARSE-SERVER.HERE/parse/verificationEmailRequest
 

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/verificationEmailRequest', json.dumps({
-       "email": "email@example.com"
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "email": "email@example.com"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -154,24 +166,26 @@ curl -X POST \ https://YOUR.PARSE-SERVER.HERE/parse/requestPasswordReset

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/requestPasswordReset', json.dumps({
-       "email": "coolguy@iloveapps.com"
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "Content-Type": "application/json"
-     })
+    "email": "coolguy@iloveapps.com"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
If successful, the response body is an empty JSON object. - ## Retrieving Users You can also retrieve the contents of a user object by sending a GET request to the URL returned in the location header when it was created. For example, to retrieve the user created above: @@ -184,26 +198,29 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/users/g7y9tkhB7O

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/users/g7y9tkhB7O', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing all the user-provided fields except `password`. It also contains the `createdAt`, `updatedAt`, and `objectId` fields: -```json +```jsonc { "username": "cooldude6", "phone": "415-392-0202", - "createdAt": "2011-11-07T20:58:34.448Z", - "updatedAt": "2011-11-07T20:58:34.448Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "g7y9tkhB7O" } ``` @@ -221,22 +238,25 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/users/me

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/users/me', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
-The response matches the JSON object above for retrieving users. If the session token is not valid, an error object is returned: +The response matches the JSON object above for retrieving users. If the session token is not valid, an error object is returned: -```json +```jsonc { "code": 209, "error": "invalid session token" @@ -262,27 +282,30 @@ curl -X PUT \ https://YOUR.PARSE-SERVER.HERE/parse/users/g7y9tkhB7O

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/users/g7y9tkhB7O', json.dumps({
-       "phone": "415-369-6201"
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im",
-       "Content-Type": "application/json"
-     })
+    "phone": "415-369-6201"
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The response body is a JSON object containing just an `updatedAt` field with the timestamp of the update. -```json +```jsonc { - "updatedAt": "2011-11-07T21:25:10.623Z" + "updatedAt": "2022-01-01T12:23:45.678Z" } ``` @@ -298,35 +321,38 @@ curl -X GET \ https://YOUR.PARSE-SERVER.HERE/parse/users

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('GET', '/parse/users', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
The return value is a JSON object that contains a `results` field with a JSON array that lists the objects. -```json +```jsonc { "results": [ { "username": "bigglesworth", "phone": "650-253-0000", - "createdAt": "2011-11-07T20:58:06.445Z", - "updatedAt": "2011-11-07T20:58:06.445Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "3KmCvT7Zsb" }, { "username": "cooldude6", "phone": "415-369-6201", - "createdAt": "2011-11-07T20:58:34.448Z", - "updatedAt": "2011-11-07T21:25:10.623Z", + "createdAt": "2022-01-01T12:23:45.678Z", + "updatedAt": "2022-01-01T12:23:45.678Z", "objectId": "g7y9tkhB7O" } ] @@ -335,7 +361,6 @@ The return value is a JSON object that contains a `results` field with a JSON ar All of the options for queries that work for regular objects also work for user objects, so check the section on [Querying Objects](#basic-queries) for more details. - ## Deleting Users To delete a user from the Parse Cloud, send a DELETE request to its URL. You must provide the `X-Parse-Session-Token` header to authenticate. For example: @@ -349,16 +374,19 @@ curl -X DELETE \ https://YOUR.PARSE-SERVER.HERE/parse/users/g7y9tkhB7O

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('DELETE', '/parse/users/g7y9tkhB7O', '', {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
-     })
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:pnktnjyb996sj4p156gjtp4im"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -366,11 +394,11 @@ print result Parse allows you to link your users with services like Twitter and Facebook, enabling your users to sign up or log into your application using their existing identities. This is accomplished through the sign-up and update REST endpoints by providing authentication data for the service you wish to link to a user in the `authData` field. Once your user is associated with a service, the `authData` for the service will be stored with the user and is retrievable by logging in. -`authData` is a JSON object with keys for each linked service containing the data below. In each case, you are responsible for completing the authentication flow (e.g. OAuth 1.0a) to obtain the information the the service requires for linking. +`authData` is a JSON object with keys for each linked service containing the data below. In each case, you are responsible for completing the authentication flow (e.g. OAuth 1.0a) to obtain the information the the service requires for linking. ### Facebook `authData` -```json +```jsonc { "facebook": { "id": "user's Facebook id number as a string", @@ -384,7 +412,7 @@ Learn more about [Facebook login](https://developers.facebook.com/docs/authentic ### Twitter `authData` -```json +```jsonc { "twitter": { "id": "user's Twitter id number as a string", @@ -401,7 +429,7 @@ Learn more about [Twitter login](https://dev.twitter.com/docs/auth/implementing- ### Anonymous user `authData` -```json +```jsonc { "anonymous": { "id": "random UUID with lowercase hexadecimal digits" @@ -411,7 +439,7 @@ Learn more about [Twitter login](https://dev.twitter.com/docs/auth/implementing- ### Signing Up and Logging In -Signing a user up with a linked service and logging them in with that service uses the same POST request, in which the `authData` for the user is specified. For example, to sign up or log in with a user's Twitter account: +Signing a user up with a linked service and logging them in with that service uses the same POST request, in which the `authData` for the user is specified. For example, to sign up or log in with a user's Twitter account:

@@ -435,32 +463,35 @@ curl -X POST \
   https://YOUR.PARSE-SERVER.HERE/parse/users
 

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('POST', '/parse/users', json.dumps({
-       "authData": {
-         "twitter": {
-           "id": "12345678",
-           "screen_name": "ParseIt",
-           "consumer_key": "SaMpLeId3X7eLjjLgWEw",
-           "consumer_secret": "SaMpLew55QbMR0vTdtOACfPXa5UdO2THX1JrxZ9s3c",
-           "auth_token": "12345678-SaMpLeTuo3m2avZxh5cjJmIrAfx4ZYyamdofM7IjU",
-           "auth_token_secret": "SaMpLeEb13SpRzQ4DAIzutEkCE2LBIm2ZQDsP3WUU"
-         }
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Revocable-Session": "1",
-       "Content-Type": "application/json"
-     })
+    "authData": {
+        "twitter": {
+            "id": "12345678",
+            "screen_name": "ParseIt",
+            "consumer_key": "SaMpLeId3X7eLjjLgWEw",
+            "consumer_secret": "SaMpLew55QbMR0vTdtOACfPXa5UdO2THX1JrxZ9s3c",
+            "auth_token": "12345678-SaMpLeTuo3m2avZxh5cjJmIrAfx4ZYyamdofM7IjU",
+            "auth_token_secret": "SaMpLeEb13SpRzQ4DAIzutEkCE2LBIm2ZQDsP3WUU"
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Revocable-Session": "1",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
-Parse then verifies that the provided `authData` is valid and checks to see if a user is already associated with this data. If so, it returns a status code of `200 OK` and the details (including a `sessionToken` for the user): +Parse then verifies that the provided `authData` is valid and checks to see if a user is already associated with this data. If so, it returns a status code of `200 OK` and the details (including a `sessionToken` for the user):

 Status: 200 OK
@@ -469,11 +500,11 @@ Location: https://https://YOUR.PARSE-SERVER.HERE/parse/users/uMz0YZeAqc
 
-The body of the response will contain the `objectId`, `createdAt`, `sessionToken`, and an automatically-generated unique `username`. For example: +The body of the response will contain the `objectId`, `createdAt`, `sessionToken`, and an automatically-generated unique `username`. For example: -```json +```jsonc { "username": "iwz8sna7sug28v4eyu7t89fij", - "createdAt": "2012-02-28T23:49:36.353Z", + "createdAt": "2022-01-01T12:23:45.678Z", "objectId": "uMz0YZeAqc", "sessionToken": "r:samplei3l83eerhnln0ecxgy5" } @@ -509,7 +540,7 @@ The body of the response will contain the `objectId`, `createdAt`, `sessionToken ### Linking -Linking an existing user with a service like Facebook or Twitter uses a PUT request to associate `authData` with the user. For example, linking a user with a Facebook account would use a request like this: +Linking an existing user with a service like Facebook or Twitter uses a PUT request to associate `authData` with the user. For example, linking a user with a Facebook account would use a request like this:

@@ -523,32 +554,35 @@ curl -X PUT \
           "facebook": {
             "id": "123456789",
             "access_token": "SaMpLeAAibS7Q55FSzcERWIEmzn6rosftAr7pmDME10008bWgyZAmv7mziwfacNOhWkgxDaBf8a2a2FCc9Hbk9wAsqLYZBLR995wxBvSGNoTrEaL",
-            "expiration_date": "2012-02-28T23:49:36.353Z"
+            "expiration_date": "2022-01-01T12:23:45.678Z"
           }
         }
       }' \
   https://YOUR.PARSE-SERVER.HERE/parse/users/uMz0YZeAqc
 

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/users/uMz0YZeAqc', json.dumps({
-       "authData": {
-         "facebook": {
-           "id": "123456789",
-           "access_token": "SaMpLeAAibS7Q55FSzcERWIEmzn6rosftAr7pmDME10008bWgyZAmv7mziwfacNOhWkgxDaBf8a2a2FCc9Hbk9wAsqLYZBLR995wxBvSGNoTrEaL",
-           "expiration_date": "2012-02-28T23:49:36.353Z"
-         }
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:samplei3l83eerhnln0ecxgy5",
-       "Content-Type": "application/json"
-     })
+    "authData": {
+        "facebook": {
+            "id": "123456789",
+            "access_token": "SaMpLeAAibS7Q55FSzcERWIEmzn6rosftAr7pmDME10008bWgyZAmv7mziwfacNOhWkgxDaBf8a2a2FCc9Hbk9wAsqLYZBLR995wxBvSGNoTrEaL",
+            "expiration_date": "2022-01-01T12:23:45.678Z"
+        }
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:samplei3l83eerhnln0ecxgy5",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -556,7 +590,7 @@ After linking your user to a service, you can authenticate them using matching ` ### Unlinking -Unlinking an existing user with a service also uses a PUT request to clear `authData` from the user by setting the `authData` for the service to `null`. For example, unlinking a user with a Facebook account would use a request like this: +Unlinking an existing user with a service also uses a PUT request to clear `authData` from the user by setting the `authData` for the service to `null`. For example, unlinking a user with a Facebook account would use a request like this:

@@ -573,21 +607,24 @@ curl -X PUT \
   https://YOUR.PARSE-SERVER.HERE/parse/users/uMz0YZeAqc
 

-import json,httplib
-connection = httplib.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+import http.client
+import json
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
 connection.connect()
 connection.request('PUT', '/parse/users/uMz0YZeAqc', json.dumps({
-       "authData": {
-         "facebook": null
-       }
-     }), {
-       "X-Parse-Application-Id": "${APPLICATION_ID}",
-       "X-Parse-REST-API-Key": "${REST_API_KEY}",
-       "X-Parse-Session-Token": "r:samplei3l83eerhnln0ecxgy5",
-       "Content-Type": "application/json"
-     })
+    "authData": {
+        "facebook": null
+    }
+}), {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Session-Token": "r:samplei3l83eerhnln0ecxgy5",
+    "Content-Type": "application/json"
+})
 result = json.loads(connection.getresponse().read())
-print result
+print(result)
 
@@ -599,17 +636,62 @@ The ACL is formatted as a JSON object where the keys are either object ids or th For example, if you want the user with id `"3KmCvT7Zsb"` to have read and write access to an object, plus the object should be publicly readable, that corresponds to an ACL of: -```json - "ACL": { - "3KmCvT7Zsb": { - "read": true, - "write": true - }, - "*": { - "read": true - } - } +```jsonc +"ACL": { + "3KmCvT7Zsb": { + "read": true, + "write": true + }, + "*": { + "read": true + } } ``` If you want to access your data ignoring all ACLs, you can use the master key provided on the Dashboard. Instead of the `X-Parse-REST-API-Key` header, set the `X-Parse-Master-Key` header. For backward compatibility, you can also do master-level authentication using HTTP Basic Auth, passing the application id as the username and the master key as the password. For security, the master key should not be distributed to end users, but if you are running code in a trusted environment, feel free to use the master key for authentication. + +## User Impersonation + +An application may allow a user to take action on behalf of another user, without having access to the other user's login credentials. The Parse REST API provides the `/loginAs` endpoint which takes a `userId` parameter, that is the `objectId` of the user for which a session should be created. A session that has been created this way can be identified by its `createdWith` property: + +```jsonc +"createdWith": { + "action": "login", + "authProvider": "masterkey" +} +``` + +Calling the endpoint requires the master key and it returns the same response format as the `/login` endpoint. + +
+

+curl -X POST \
+  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
+  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
+  -H "X-Parse-Master-Key: ${MASTER_KEY}" \
+  -H "X-Parse-Revocable-Session: 1" \
+  -G \
+  --data-urlencode 'userId=abc123' \
+  https://YOUR.PARSE-SERVER.HERE/parse/loginAs
+
+

+import http.client
+import json
+import urllib.parse
+
+
+connection = http.client.HTTPSConnection('YOUR.PARSE-SERVER.HERE', 443)
+params = urllib.parse.urlencode({"userId": "abc123"})
+connection.connect()
+connection.request('POST', '/parse/loginAs?%s' % params, '', {
+    "X-Parse-Application-Id": "${APPLICATION_ID}",
+    "X-Parse-REST-API-Key": "${REST_API_KEY}",
+    "X-Parse-Master-Key": "${MASTER_KEY}",
+    "X-Parse-Revocable-Session": "1"
+})
+result = json.loads(connection.getresponse().read())
+print(result)
+
+
+ +Calling this endpoint does not invoke [session triggers](https://docs.parseplatform.org/cloudcode/guide/#session-triggers) such as `beforeLogin` and `afterLogin`. This action will always succeed if the supplied user exists in the database, regardless of whether the user is currently locked out. diff --git a/_includes/unity/objects.md b/_includes/unity/objects.md index 48af37bf1..d675d2662 100644 --- a/_includes/unity/objects.md +++ b/_includes/unity/objects.md @@ -6,7 +6,7 @@ Storing data on Parse is built around the `ParseObject`. Each `ParseObject` cont For example, let's say you're tracking high scores for a game. A single `ParseObject` could contain: -```json +```jsonc score: 1337, playerName: "Sean Plott", cheatMode: false ``` @@ -27,9 +27,15 @@ Task saveTask = gameScore.SaveAsync(); After this code runs, you will probably be wondering if anything really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this: -```js -objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, -createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z" +```jsonc +{ + "objectId": "xWMyZ4YEGZ", + "score": 1337, + "playerName": "Sean Plott", + "cheatMode": false, + "createdAt":"2022-01-01T12:23:45.678Z", + "updatedAt":"2022-01-01T12:23:45.678Z" +} ``` There are two things to note here. You didn't have to configure or set up a new Class called `GameScore` before running this code. Your Parse app lazily creates this Class for you when it first encounters it. diff --git a/_layouts/default.html b/_layouts/default.html index 774d3af8f..37822f2ae 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -27,7 +27,7 @@ const text = copyText.textContent || copyText.innerText; const input = document.createElement('textarea'); - input.innerHTML = text; + input.innerHTML = text.replace(/\n$/, ''); document.body.appendChild(input); input.select(); input.setSelectionRange(0, 99999); @@ -51,6 +51,6 @@ code.before(btn); count++; }); - }; + } diff --git a/android-api.md b/android-api.md index 7ca15a4fb..f0304fa57 100644 --- a/android-api.md +++ b/android-api.md @@ -3,5 +3,5 @@ layout: redirected sitemap: false permalink: /android/api/ redirect_to: - - {{ site.apis.android }} + - https://parseplatform.org/Parse-SDK-Android/api/ --- diff --git a/assets/js/bundle.js b/assets/js/bundle.js index 11ed8d8cc..4905fd056 100644 --- a/assets/js/bundle.js +++ b/assets/js/bundle.js @@ -1,11 +1,2 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=71)}([function(e,t,n){(function(r){var o,i;o=[n(15),n(39),n(19),n(40),n(41),n(25),n(20),n(42),n(26),n(43),n(73),n(8),n(1),n(16),n(44),n(11)],void 0===(i=function(e,t,n,r,o,i,a,s,u,c,l,f,p,d,h,v){"use strict";var g=function(e,t){return new g.fn.init(e,t)};function m(e){var t=!!e&&"length"in e&&e.length,n=v(e);return!p(e)&&!d(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}return g.fn=g.prototype={jquery:"3.5.0",constructor:g,length:0,toArray:function(){return n.call(this)},get:function(e){return null==e?n.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=g.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return g.each(this,e)},map:function(e){return this.pushStack(g.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(n.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(g.grep(this,(function(e,t){return(t+1)%2})))},odd:function(){return this.pushStack(g.grep(this,(function(e,t){return t%2})))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n)[^>]*|#([\w-]+))$/,a=e.fn.init=function(a,s,u){var c,l;if(!a)return this;if(u=u||o,"string"==typeof a){if(!(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:i.exec(a))||!c[1]&&s)return!s||s.jquery?(s||u).find(a):this.constructor(s).find(a);if(c[1]){if(s=s instanceof e?s[0]:s,e.merge(this,e.parseHTML(c[1],s&&s.nodeType?s.ownerDocument||s:t,!0)),r.test(c[1])&&e.isPlainObject(s))for(c in s)n(this[c])?this[c](s[c]):this.attr(c,s[c]);return this}return(l=t.getElementById(c[2]))&&(this[0]=l,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):n(a)?void 0!==u.ready?u.ready(a):a(e):e.makeArray(a,this)};return a.prototype=e.fn,o=e(t),a}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(49)],void 0===(o=function(e){"use strict";return new e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r;void 0===(r=function(){"use strict";return/[^\x20\t\r\n\f]+/g}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r;void 0===(r=function(){"use strict";return{}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(11),n(1)],void 0===(o=function(e,t,n){"use strict";var r=function(o,i,a,s,u,c,l){var f=0,p=o.length,d=null==a;if("object"===t(a))for(f in u=!0,a)r(o,i,f,a[f],!0,c,l);else if(void 0!==s&&(u=!0,n(s)||(l=!0),d&&(l?(i.call(o,s),i=null):(d=i,i=function(t,n,r){return d.call(e(t),r)})),i))for(;f0&&(T=window.setTimeout((function(){P.abort("timeout")}),j.timeout));try{k=!1,x.send(I,R)}catch(e){if(k)throw e;R(-1,e)}}else R(-1,"No Transport");function R(t,n,r,o){var i,a,s,u,c,l=n;k||(k=!0,T&&window.clearTimeout(T),x=void 0,w=o||"",P.readyState=t>0?4:0,i=t>=200&&t<300||304===t,r&&(u=function(e,t,n){for(var r,o,i,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(o in s)if(s[o]&&s[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+" "+u[0]]){i=o;break}a||(a=o)}i=i||a}if(i)return i!==u[0]&&u.unshift(i),n[i]}(j,P,r)),!i&&e.inArray("script",j.dataTypes)>-1&&(j.converters["text script"]=function(){}),u=function(e,t,n,r){var o,i,a,s,u,c={},l=e.dataTypes.slice();if(l[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(i=l.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=l.shift())if("*"===i)i=u;else if("*"!==u&&u!==i){if(!(a=c[u+" "+i]||c["* "+i]))for(o in c)if((s=o.split(" "))[1]===i&&(a=c[u+" "+s[0]]||c["* "+s[0]])){!0===a?a=c[o]:!0!==c[o]&&(i=s[0],l.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+i}}}return{state:"success",data:t}}(j,u,P,i),i?(j.ifModified&&((c=P.getResponseHeader("Last-Modified"))&&(e.lastModified[b]=c),(c=P.getResponseHeader("etag"))&&(e.etag[b]=c)),204===t||"HEAD"===j.type?l="nocontent":304===t?l="notmodified":(l=u.state,a=u.data,i=!(s=u.error))):(s=l,!t&&l||(l="error",t<0&&(t=0))),P.status=t,P.statusText=(n||l)+"",i?L.resolveWith(D,[a,l,P]):L.rejectWith(D,[P,l,s]),P.statusCode(_),_=void 0,E&&O.trigger(i?"ajaxSuccess":"ajaxError",[P,j,i?a:s]),q.fireWith(D,[P,l]),E&&(O.trigger("ajaxComplete",[P,j]),--e.active||e.event.trigger("ajaxStop")))}return P},getJSON:function(t,n,r){return e.get(t,n,r,"json")},getScript:function(t,n){return e.get(t,void 0,n,"script")}}),e.each(["get","post"],(function(t,r){e[r]=function(t,o,i,a){return n(o)&&(a=a||i,i=o,o=void 0),e.ajax(e.extend({url:t,type:r,dataType:a,data:o,success:i},e.isPlainObject(t)&&t))}})),e.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(20),n(42)],void 0===(o=function(e,t){"use strict";return function(n){return null==n?n+"":"object"==typeof n||"function"==typeof n?e[t.call(n)]||"object":typeof n}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(39),n(25),n(76),n(77),n(45),n(6),n(4),n(47),n(3)],void 0===(o=function(e,t,n,r,o,i,a){"use strict";var s=/^(?:parents|prev(?:Until|All))/,u={children:!0,contents:!0,next:!0,prev:!0};function c(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}return e.fn.extend({has:function(t){var n=e(t,this),r=n.length;return this.filter((function(){for(var t=0;t-1:1===r.nodeType&&e.find.matchesSelector(r,t))){s.push(r);break}return this.pushStack(s.length>1?e.uniqueSort(s):s)},index:function(t){return t?"string"==typeof t?n.call(e(t),this[0]):n.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,n){return this.pushStack(e.uniqueSort(e.merge(this.get(),e(t,n))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),e.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return r(e,"parentNode")},parentsUntil:function(e,t,n){return r(e,"parentNode",n)},next:function(e){return c(e,"nextSibling")},prev:function(e){return c(e,"previousSibling")},nextAll:function(e){return r(e,"nextSibling")},prevAll:function(e){return r(e,"previousSibling")},nextUntil:function(e,t,n){return r(e,"nextSibling",n)},prevUntil:function(e,t,n){return r(e,"previousSibling",n)},siblings:function(e){return o((e.parentNode||{}).firstChild,e)},children:function(e){return o(e.firstChild)},contents:function(n){return null!=n.contentDocument&&t(n.contentDocument)?n.contentDocument:(a(n,"template")&&(n=n.content||n),e.merge([],n.childNodes))}},(function(t,n){e.fn[t]=function(r,o){var i=e.map(this,n,r);return"Until"!==t.slice(-5)&&(o=r),o&&"string"==typeof o&&(i=e.filter(o,i)),this.length>1&&(u[t]||e.uniqueSort(i),s.test(t)&&i.reverse()),this.pushStack(i)}})),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(1),n(19),n(27)],void 0===(o=function(e,t,n){"use strict";function r(e){return e}function o(e){throw e}function i(e,n,r,o){var i;try{e&&t(i=e.promise)?i.call(e).done(n).fail(r):e&&t(i=e.then)?i.call(e,n,r):n.apply(void 0,[e].slice(o))}catch(e){r.apply(void 0,[e])}}return e.extend({Deferred:function(n){var i=[["notify","progress",e.Callbacks("memory"),e.Callbacks("memory"),2],["resolve","done",e.Callbacks("once memory"),e.Callbacks("once memory"),0,"resolved"],["reject","fail",e.Callbacks("once memory"),e.Callbacks("once memory"),1,"rejected"]],a="pending",s={state:function(){return a},always:function(){return u.done(arguments).fail(arguments),this},catch:function(e){return s.then(null,e)},pipe:function(){var n=arguments;return e.Deferred((function(r){e.each(i,(function(e,o){var i=t(n[o[4]])&&n[o[4]];u[o[1]]((function(){var e=i&&i.apply(this,arguments);e&&t(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[o[0]+"With"](this,i?[e]:arguments)}))})),n=null})).promise()},then:function(n,a,s){var u=0;function c(n,i,a,s){return function(){var l=this,f=arguments,p=function(){var e,p;if(!(n=u&&(a!==o&&(l=void 0,f=[t]),i.rejectWith(l,f))}};n?d():(e.Deferred.getStackHook&&(d.stackTrace=e.Deferred.getStackHook()),window.setTimeout(d))}}return e.Deferred((function(e){i[0][3].add(c(0,e,t(s)?s:r,e.notifyWith)),i[1][3].add(c(0,e,t(n)?n:r)),i[2][3].add(c(0,e,t(a)?a:o))})).promise()},promise:function(t){return null!=t?e.extend(t,s):s}},u={};return e.each(i,(function(e,t){var n=t[2],r=t[5];s[t[1]]=n.add,r&&n.add((function(){a=r}),i[3-e][2].disable,i[3-e][3].disable,i[0][2].lock,i[0][3].lock),n.add(t[3].fire),u[t[0]]=function(){return u[t[0]+"With"](this===u?void 0:this,arguments),this},u[t[0]+"With"]=n.fireWith})),s.promise(u),n&&n.call(u,u),u},when:function(r){var o=arguments.length,a=o,s=Array(a),u=n.call(arguments),c=e.Deferred(),l=function(e){return function(t){s[e]=this,u[e]=arguments.length>1?n.call(arguments):t,--o||c.resolveWith(s,u)}};if(o<=1&&(i(r,c.done(l(a)).resolve,c.reject,!o),"pending"===c.state()||t(u[a]&&u[a].then)))return c.then();for(;a--;)i(u[a],l(a),c.reject);return c.promise()}}),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(2),n(23),n(1),n(7),n(32),n(19),n(21),n(5),n(6),n(4),n(3)],void 0===(o=function(e,t,n,r,o,i,a,s,u,c){"use strict";var l=/^key/,f=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,p=/^([^.]*)(?:\.(.+)|)/;function d(){return!0}function h(){return!1}function v(e,n){return e===function(){try{return t.activeElement}catch(e){}}()==("focus"===n)}function g(t,n,r,o,i,a){var s,u;if("object"==typeof n){for(u in"string"!=typeof r&&(o=o||r,r=void 0),n)g(t,u,r,o,n[u],a);return t}if(null==o&&null==i?(i=r,o=r=void 0):null==i&&("string"==typeof r?(i=o,o=void 0):(i=o,o=r,r=void 0)),!1===i)i=h;else if(!i)return t;return 1===a&&(s=i,(i=function(t){return e().off(t),s.apply(this,arguments)}).guid=s.guid||(s.guid=e.guid++)),t.each((function(){e.event.add(this,n,i,o,r)}))}function m(t,n,r){r?(u.set(t,n,!1),e.event.add(t,n,{namespace:!1,handler:function(t){var o,i,s=u.get(this,n);if(1&t.isTrigger&&this[n]){if(s.length)(e.event.special[n]||{}).delegateType&&t.stopPropagation();else if(s=a.call(arguments),u.set(this,n,s),o=r(this,n),this[n](),s!==(i=u.get(this,n))||o?u.set(this,n,!1):i={},s!==i)return t.stopImmediatePropagation(),t.preventDefault(),i.value}else s.length&&(u.set(this,n,{value:e.event.trigger(e.extend(s[0],e.Event.prototype),s.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===u.get(t,n)&&e.event.add(t,n,d)}return e.event={global:{},add:function(t,r,i,a,c){var l,f,d,h,v,g,m,y,x,b,w,C=u.get(t);if(s(t))for(i.handler&&(i=(l=i).handler,c=l.selector),c&&e.find.matchesSelector(n,c),i.guid||(i.guid=e.guid++),(h=C.events)||(h=C.events=Object.create(null)),(f=C.handle)||(f=C.handle=function(n){return void 0!==e&&e.event.triggered!==n.type?e.event.dispatch.apply(t,arguments):void 0}),v=(r=(r||"").match(o)||[""]).length;v--;)x=w=(d=p.exec(r[v])||[])[1],b=(d[2]||"").split(".").sort(),x&&(m=e.event.special[x]||{},x=(c?m.delegateType:m.bindType)||x,m=e.event.special[x]||{},g=e.extend({type:x,origType:w,data:a,handler:i,guid:i.guid,selector:c,needsContext:c&&e.expr.match.needsContext.test(c),namespace:b.join(".")},l),(y=h[x])||((y=h[x]=[]).delegateCount=0,m.setup&&!1!==m.setup.call(t,a,b,f)||t.addEventListener&&t.addEventListener(x,f)),m.add&&(m.add.call(t,g),g.handler.guid||(g.handler.guid=i.guid)),c?y.splice(y.delegateCount++,0,g):y.push(g),e.event.global[x]=!0)},remove:function(t,n,r,i,a){var s,c,l,f,d,h,v,g,m,y,x,b=u.hasData(t)&&u.get(t);if(b&&(f=b.events)){for(d=(n=(n||"").match(o)||[""]).length;d--;)if(m=x=(l=p.exec(n[d])||[])[1],y=(l[2]||"").split(".").sort(),m){for(v=e.event.special[m]||{},g=f[m=(i?v.delegateType:v.bindType)||m]||[],l=l[2]&&new RegExp("(^|\\.)"+y.join("\\.(?:.*\\.|)")+"(\\.|$)"),c=s=g.length;s--;)h=g[s],!a&&x!==h.origType||r&&r.guid!==h.guid||l&&!l.test(h.namespace)||i&&i!==h.selector&&("**"!==i||!h.selector)||(g.splice(s,1),h.selector&&g.delegateCount--,v.remove&&v.remove.call(t,h));c&&!g.length&&(v.teardown&&!1!==v.teardown.call(t,y,b.handle)||e.removeEvent(t,m,b.handle),delete f[m])}else for(m in f)e.event.remove(t,m+n[d],r,i,!0);e.isEmptyObject(f)&&u.remove(t,"handle events")}},dispatch:function(t){var n,r,o,i,a,s,c=new Array(arguments.length),l=e.event.fix(t),f=(u.get(this,"events")||Object.create(null))[l.type]||[],p=e.event.special[l.type]||{};for(c[0]=l,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==t.type||!0!==l.disabled)){for(a=[],s={},r=0;r-1:e.find(i,this,null,[l]).length),s[i]&&a.push(o);a.length&&u.push({elem:l,handlers:a})}return l=this,c=0&&(l+=Math.max(0,Math.ceil(t["offset"+n[0].toUpperCase()+n.slice(1)]-s-l-c-.5))||0),l}function b(t,n,o){var a=s(t),u=(!p.boxSizingReliable()||o)&&"border-box"===e.css(t,"boxSizing",!1,a),l=u,f=c(t,n,a),d="offset"+n[0].toUpperCase()+n.slice(1);if(i.test(f)){if(!o)return f;f="auto"}return(!p.boxSizingReliable()&&u||!p.reliableTrDimensions()&&r(t,"tr")||"auto"===f||!parseFloat(f)&&"inline"===e.css(t,"display",!1,a))&&t.getClientRects().length&&(u="border-box"===e.css(t,"boxSizing",!1,a),(l=d in t)&&(f=t[d])),(f=parseFloat(f)||0)+x(t,n,o||(u?"border":"content"),l,a,f)+"px"}return e.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=c(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,r,i,a){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var s,u,c,f=n(r),h=v.test(r),g=t.style;if(h||(r=d(f)),c=e.cssHooks[r]||e.cssHooks[f],void 0===i)return c&&"get"in c&&void 0!==(s=c.get(t,!1,a))?s:g[r];"string"===(u=typeof i)&&(s=o.exec(i))&&s[1]&&(i=l(t,r,s),u="number"),null!=i&&i==i&&("number"!==u||h||(i+=s&&s[3]||(e.cssNumber[f]?"":"px")),p.clearCloneStyle||""!==i||0!==r.indexOf("background")||(g[r]="inherit"),c&&"set"in c&&void 0===(i=c.set(t,i,a))||(h?g.setProperty(r,i):g[r]=i))}},css:function(t,r,o,i){var a,s,u,l=n(r);return v.test(r)||(r=d(l)),(u=e.cssHooks[r]||e.cssHooks[l])&&"get"in u&&(a=u.get(t,!0,o)),void 0===a&&(a=c(t,r,i)),"normal"===a&&r in m&&(a=m[r]),""===o||o?(s=parseFloat(a),!0===o||isFinite(s)?s||0:a):a}}),e.each(["height","width"],(function(t,n){e.cssHooks[n]={get:function(t,r,o){if(r)return!h.test(e.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?b(t,n,o):u(t,g,(function(){return b(t,n,o)}))},set:function(t,r,i){var a,u=s(t),c=!p.scrollboxSize()&&"absolute"===u.position,l=(c||i)&&"border-box"===e.css(t,"boxSizing",!1,u),f=i?x(t,n,i,l,u):0;return l&&c&&(f-=Math.ceil(t["offset"+n[0].toUpperCase()+n.slice(1)]-parseFloat(u[n])-x(t,n,"border",!1,u)-.5)),f&&(a=o.exec(r))&&"px"!==(a[3]||"px")&&(t.style[n]=r,r=e.css(t,n)),y(0,r,f)}}})),e.cssHooks.marginLeft=f(p.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(c(e,"marginLeft"))||e.getBoundingClientRect().left-u(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),e.each({margin:"",padding:"",border:"Width"},(function(t,n){e.cssHooks[t+n]={expand:function(e){for(var r=0,o={},i="string"==typeof e?e.split(" "):[e];r<4;r++)o[t+a[r]+n]=i[r]||i[r-2]||i[0];return o}},"margin"!==t&&(e.cssHooks[t+n].set=y)})),e.fn.extend({css:function(n,r){return t(this,(function(t,n,r){var o,i,a={},u=0;if(Array.isArray(n)){for(o=s(t),i=n.length;u1)}}),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(15)],void 0===(o=function(e){"use strict";return e.slice}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return{}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r;void 0===(r=function(){"use strict";return function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(23),n(3)],void 0===(o=function(e,t){"use strict";var n=function(t){return e.contains(t.ownerDocument,t)},r={composed:!0};return t.getRootNode&&(n=function(t){return e.contains(t.ownerDocument,t)||t.getRootNode(r)===t.ownerDocument}),n}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(2)],void 0===(o=function(e){"use strict";return e.documentElement}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(22),n(40),n(1),n(41),n(32),n(9),n(54),n(55),n(56),n(58),n(59),n(60),n(57),n(5),n(50),n(21),n(44),n(6),n(4),n(12),n(3),n(14)],void 0===(o=function(e,t,n,r,o,i,a,s,u,c,l,f,p,d,h,v,g,m,y){"use strict";var x=/\s*$/g;function C(t,n){return y(t,"table")&&y(11!==n.nodeType?n:n.firstChild,"tr")&&e(t).children("tbody")[0]||t}function T(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function S(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function k(t,n){var r,o,i,a,s,u;if(1===n.nodeType){if(h.hasData(t)&&(u=h.get(t).events))for(i in h.remove(n,"handle events"),u)for(r=0,o=u[i].length;r1&&"string"==typeof E&&!d.checkClone&&b.test(E))return t.each((function(e){var n=t.eq(e);N&&(o[0]=E.call(this,e,n.html())),A(n,o,i,a)}));if(C&&(c=(s=p(o,t[0].ownerDocument,!1,t,a)).firstChild,1===s.childNodes.length&&(s=c),c||a)){for(v=(f=e.map(l(s,"script"),T)).length;x0&&f(u,!p&&l(n,"script")),c},cleanData:function(t){for(var n,r,o,i=e.event.special,a=0;void 0!==(r=t[a]);a++)if(g(r)){if(n=r[h.expando]){if(n.events)for(o in n.events)i[o]?e.event.remove(r,o):e.removeEvent(r,o,n.handle);r[h.expando]=void 0}r[v.expando]&&(r[v.expando]=void 0)}}}),e.fn.extend({detach:function(e){return N(this,e,!0)},remove:function(e){return N(this,e)},text:function(t){return a(this,(function(t){return void 0===t?e.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return A(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||C(this,e).appendChild(e)}))},prepend:function(){return A(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=C(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return A(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return A(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var t,n=0;null!=(t=this[n]);n++)1===t.nodeType&&(e.cleanData(l(t,!1)),t.textContent="");return this},clone:function(t,n){return t=null!=t&&t,n=null==n?t:n,this.map((function(){return e.clone(this,t,n)}))},html:function(t){return a(this,(function(t){var n=this[0]||{},r=0,o=this.length;if(void 0===t&&1===n.nodeType)return n.innerHTML;if("string"==typeof t&&!x.test(t)&&!c[(s.exec(t)||["",""])[1].toLowerCase()]){t=e.htmlPrefilter(t);try{for(;r-1;)c.splice(r,1),r<=f&&f--})),this},has:function(t){return t?e.inArray(t,c)>-1:c.length>0},empty:function(){return c&&(c=[]),this},disable:function(){return u=l=[],c=a="",this},disabled:function(){return!c},lock:function(){return u=l=[],a||i||(c=a=""),this},locked:function(){return!!u},fireWith:function(e,t){return u||(t=[e,(t=t||[]).slice?t.slice():t],l.push(t),i||p()),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!s}};return d},e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(5),n(13),n(27)],void 0===(o=function(e,t){"use strict";return e.extend({queue:function(n,r,o){var i;if(n)return r=(r||"fx")+"queue",i=t.get(n,r),o&&(!i||Array.isArray(o)?i=t.access(n,r,e.makeArray(o)):i.push(o)),i||[]},dequeue:function(t,n){n=n||"fx";var r=e.queue(t,n),o=r.length,i=r.shift(),a=e._queueHooks(t,n);"inprogress"===i&&(i=r.shift(),o--),i&&("fx"===n&&r.unshift("inprogress"),delete a.stop,i.call(t,(function(){e.dequeue(t,n)}),a)),!o&&a&&a.empty.fire()},_queueHooks:function(n,r){var o=r+"queueHooks";return t.get(n,o)||t.access(n,o,{empty:e.Callbacks("once memory").add((function(){t.remove(n,[r+"queue",o])}))})}}),e.fn.extend({queue:function(t,n){var r=2;return"string"!=typeof t&&(n=t,t="fx",r--),arguments.length3,n.removeChild(e)),l}}))}(),r}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(2),n(8)],void 0===(o=function(e,t){"use strict";var n,r;return n=e.createElement("input"),r=e.createElement("select").appendChild(e.createElement("option")),n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=r.selected,(n=e.createElement("input")).value="t",n.type="radio",t.radioValue="t"===n.value,t}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(7)],void 0===(o=function(e){"use strict";return function(t){return(t.match(e)||[]).join(" ")}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(2),n(5),n(21),n(26),n(1),n(16),n(14)],void 0===(o=function(e,t,n,r,o,i,a){"use strict";var s=/^(?:focusinfocus|focusoutblur)$/,u=function(e){e.stopPropagation()};return e.extend(e.event,{trigger:function(c,l,f,p){var d,h,v,g,m,y,x,b,w=[f||t],C=o.call(c,"type")?c.type:c,T=o.call(c,"namespace")?c.namespace.split("."):[];if(h=b=v=f=f||t,3!==f.nodeType&&8!==f.nodeType&&!s.test(C+e.event.triggered)&&(C.indexOf(".")>-1&&(T=C.split("."),C=T.shift(),T.sort()),m=C.indexOf(":")<0&&"on"+C,(c=c[e.expando]?c:new e.Event(C,"object"==typeof c&&c)).isTrigger=p?2:3,c.namespace=T.join("."),c.rnamespace=c.namespace?new RegExp("(^|\\.)"+T.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,c.result=void 0,c.target||(c.target=f),l=null==l?[c]:e.makeArray(l,[c]),x=e.event.special[C]||{},p||!x.trigger||!1!==x.trigger.apply(f,l))){if(!p&&!x.noBubble&&!a(f)){for(g=x.delegateType||C,s.test(g+C)||(h=h.parentNode);h;h=h.parentNode)w.push(h),v=h;v===(f.ownerDocument||t)&&w.push(v.defaultView||v.parentWindow||window)}for(d=0;(h=w[d++])&&!c.isPropagationStopped();)b=h,c.type=d>1?g:x.bindType||C,(y=(n.get(h,"events")||Object.create(null))[c.type]&&n.get(h,"handle"))&&y.apply(h,l),(y=m&&h[m])&&y.apply&&r(h)&&(c.result=y.apply(h,l),!1===c.result&&c.preventDefault());return c.type=C,p||c.isDefaultPrevented()||x._default&&!1!==x._default.apply(w.pop(),l)||!r(f)||m&&i(f[C])&&!a(f)&&((v=f[m])&&(f[m]=null),e.event.triggered=C,c.isPropagationStopped()&&b.addEventListener(C,u),f[C](),c.isPropagationStopped()&&b.removeEventListener(C,u),e.event.triggered=void 0,v&&(f[m]=v)),c.result}},simulate:function(t,n,r){var o=e.extend(new e.Event,r,{type:t,isSimulated:!0});e.event.trigger(o,null,n)}}),e.fn.extend({trigger:function(t,n){return this.each((function(){e.event.trigger(t,n,this)}))},triggerHandler:function(t,n){var r=this[0];if(r)return e.event.trigger(t,n,r,!0)}}),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(3),n(12),n(27),n(13),n(78),n(48),n(80),n(28),n(81),n(86),n(14),n(90),n(24),n(92),n(94),n(18),n(95),n(69),n(10),n(96),n(97),n(98),n(99),n(68),n(70),n(29),n(101),n(102),n(103),n(104),n(107),n(108)],void 0===(o=function(e){"use strict";return e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return Object.getPrototypeOf}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(15)],void 0===(o=function(e){"use strict";return e.flat?function(t){return e.flat.call(t)}:function(t){return e.concat.apply([],t)}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(15)],void 0===(o=function(e){"use strict";return e.push}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(20)],void 0===(o=function(e){"use strict";return e.toString}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(26)],void 0===(o=function(e){"use strict";return e.toString}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(2)],void 0===(o=function(e){"use strict";var t={type:!0,src:!0,nonce:!0,noModule:!0};return function(n,r,o){var i,a,s=(o=o||e).createElement("script");if(s.text=n,r)for(i in t)(a=r[i]||r.getAttribute&&r.getAttribute(i))&&s.setAttribute(i,a);o.head.appendChild(s).parentNode.removeChild(s)}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(3)],void 0===(o=function(e){"use strict";return e.expr.match.needsContext}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(25),n(1),n(45),n(3)],void 0===(o=function(e,t,n,r){"use strict";function o(r,o,i){return n(o)?e.grep(r,(function(e,t){return!!o.call(e,t,e)!==i})):o.nodeType?e.grep(r,(function(e){return e===o!==i})):"string"!=typeof o?e.grep(r,(function(e){return t.call(o,e)>-1!==i})):e.filter(o,r,i)}e.filter=function(t,n,r){var o=n[0];return r&&(t=":not("+t+")"),1===n.length&&1===o.nodeType?e.find.matchesSelector(o,t)?[o]:[]:e.find.matches(t,e.grep(n,(function(e){return 1===e.nodeType})))},e.fn.extend({find:function(t){var n,r,o=this.length,i=this;if("string"!=typeof t)return this.pushStack(e(t).filter((function(){for(n=0;n1?e.uniqueSort(r):r},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(t){return!!o(this,"string"==typeof t&&r.test(t)?e(t):t||[],!1).length}})}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(2),n(79),n(13)],void 0===(o=function(e,t){"use strict";var n=e.Deferred();function r(){t.removeEventListener("DOMContentLoaded",r),window.removeEventListener("load",r),e.ready()}e.fn.ready=function(t){return n.then(t).catch((function(t){e.readyException(t)})),this},e.extend({isReady:!1,readyWait:1,ready:function(r){(!0===r?--e.readyWait:e.isReady)||(e.isReady=!0,!0!==r&&--e.readyWait>0||n.resolveWith(t,[e]))}}),e.ready.then=n.then,"complete"===t.readyState||"loading"!==t.readyState&&!t.documentElement.doScroll?window.setTimeout(e.ready):(t.addEventListener("DOMContentLoaded",r),window.addEventListener("load",r))}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(17),n(7),n(21)],void 0===(o=function(e,t,n,r){"use strict";function o(){this.expando=e.expando+o.uid++}return o.uid=1,o.prototype={cache:function(e){var t=e[this.expando];return t||(t=Object.create(null),r(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,n,r){var o,i=this.cache(e);if("string"==typeof n)i[t(n)]=r;else for(o in n)i[t(o)]=n[o];return i},get:function(e,n){return void 0===n?this.cache(e):e[this.expando]&&e[this.expando][t(n)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(r,o){var i,a=r[this.expando];if(void 0!==a){if(void 0!==o){i=(o=Array.isArray(o)?o.map(t):(o=t(o))in a?[o]:o.match(n)||[]).length;for(;i--;)delete a[o[i]]}(void 0===o||e.isEmptyObject(a))&&(r.nodeType?r[this.expando]=void 0:delete r[this.expando])}},hasData:function(t){var n=t[this.expando];return void 0!==n&&!e.isEmptyObject(n)}},o}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(49)],void 0===(o=function(e){"use strict";return new e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(22)],void 0===(o=function(e,t){"use strict";return function(n,r){return"none"===(n=r||n).style.display||""===n.style.display&&t(n)&&"none"===e.css(n,"display")}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(30)],void 0===(o=function(e,t){"use strict";return function(n,r,o,i){var a,s,u=20,c=i?function(){return i.cur()}:function(){return e.css(n,r,"")},l=c(),f=o&&o[3]||(e.cssNumber[r]?"":"px"),p=n.nodeType&&(e.cssNumber[r]||"px"!==f&&+l)&&t.exec(e.css(n,r));if(p&&p[3]!==f){for(l/=2,f=f||p[3],p=+l||1;u--;)e.style(n,r,p+f),(1-s)*(1-(s=c()/l||.5))<=0&&(u=0),p/=s;p*=2,e.style(n,r,p+f),o=o||[]}return o&&(p=+p||+l||0,a=o[1]?p+(o[1]+1)*o[2]:+o[2],i&&(i.unit=f,i.start=p,i.end=a)),a}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return/<([a-z][^\/\0>\x20\t\r\n\f]*)/i}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r;void 0===(r=function(){"use strict";return/^$|^module$|\/(?:java|ecma)script/i}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(57)],void 0===(o=function(e){"use strict";var t={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};return t.tbody=t.tfoot=t.colgroup=t.caption=t.thead,t.th=t.td,e.option||(t.optgroup=t.option=[1,""]),t}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(2),n(8)],void 0===(o=function(e,t){"use strict";var n,r;return n=e.createDocumentFragment().appendChild(e.createElement("div")),(r=e.createElement("input")).setAttribute("type","radio"),r.setAttribute("checked","checked"),r.setAttribute("name","t"),n.appendChild(r),t.checkClone=n.cloneNode(!0).cloneNode(!0).lastChild.checked,n.innerHTML="",t.noCloneChecked=!!n.cloneNode(!0).lastChild.defaultValue,n.innerHTML="",t.option=!!n.lastChild,t}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(6)],void 0===(o=function(e,t){"use strict";return function(n,r){var o;return o=void 0!==n.getElementsByTagName?n.getElementsByTagName(r||"*"):void 0!==n.querySelectorAll?n.querySelectorAll(r||"*"):[],void 0===r||r&&t(n,r)?e.merge([n],o):o}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(5)],void 0===(o=function(e){"use strict";return function(t,n){for(var r=0,o=t.length;r-1)d&&d.push(h);else if(y=n(h),v=a(b.appendChild(h),"script"),y&&s(v),f)for(x=0;h=v[x++];)o.test(h.type||"")&&f.push(h);return b}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=window),t.getComputedStyle(e)}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(22),n(84),n(33),n(61),n(34)],void 0===(o=function(e,t,n,r,o,i){"use strict";return function(a,s,u){var c,l,f,p,d=a.style;return(u=u||o(a))&&(""!==(p=u.getPropertyValue(s)||u[s])||t(a)||(p=e.style(a,s)),!i.pixelBoxStyles()&&r.test(p)&&n.test(s)&&(c=d.width,l=d.minWidth,f=d.maxWidth,d.minWidth=d.maxWidth=d.width=p,p=u.width,d.width=c,d.minWidth=l,d.maxWidth=f)),void 0!==p?p+"":p}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return function(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(2),n(0)],void 0===(o=function(e,t){"use strict";var n=["Webkit","Moz","ms"],r=e.createElement("div").style,o={};return function(e){var i=t.cssProps[e]||o[e];return i||(e in r?e:o[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),o=n.length;o--;)if((e=n[o]+t)in r)return e}(e)||e)}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(9),n(35),n(3)],void 0===(o=function(e,t,n){"use strict";var r=/^(?:input|select|textarea|button)$/i,o=/^(?:a|area)$/i;e.fn.extend({prop:function(n,r){return t(this,e.prop,n,r,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[e.propFix[t]||t]}))}}),e.extend({prop:function(t,n,r){var o,i,a=t.nodeType;if(3!==a&&8!==a&&2!==a)return 1===a&&e.isXMLDoc(t)||(n=e.propFix[n]||n,i=e.propHooks[n]),void 0!==r?i&&"set"in i&&void 0!==(o=i.set(t,r,n))?o:t[n]=r:i&&"get"in i&&null!==(o=i.get(t,n))?o:t[n]},propHooks:{tabIndex:{get:function(t){var n=e.find.attr(t,"tabindex");return n?parseInt(n,10):r.test(t.nodeName)||o.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),n.optSelected||(e.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),e.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){e.propFix[this.toLowerCase()]=this}))}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return{guid:Date.now()}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r;void 0===(r=function(){"use strict";return/\?/}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0)],void 0===(o=function(e){"use strict";return e.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new window.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||e.error("Invalid XML: "+t),n},e.parseXML}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(11),n(32),n(1),n(4),n(12),n(65)],void 0===(o=function(e,t,n,r){"use strict";var o=/\[\]$/,i=/\r?\n/g,a=/^(?:submit|button|image|reset|file)$/i,s=/^(?:input|select|textarea|keygen)/i;function u(n,r,i,a){var s;if(Array.isArray(r))e.each(r,(function(e,t){i||o.test(n)?a(n,t):u(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,i,a)}));else if(i||"object"!==t(r))a(n,r);else for(s in r)u(n+"["+s+"]",r[s],i,a)}return e.param=function(t,n){var o,i=[],a=function(e,t){var n=r(t)?t():t;i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!e.isPlainObject(t))e.each(t,(function(){a(this.name,this.value)}));else for(o in t)u(o,t[o],n,a);return i.join("&")},e.fn.extend({serialize:function(){return e.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=e.prop(this,"elements");return t?e.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!e(this).is(":disabled")&&s.test(this.nodeName)&&!a.test(t)&&(this.checked||!n.test(t))})).map((function(t,n){var r=e(this).val();return null==r?null:Array.isArray(r)?e.map(r,(function(e){return{name:n.name,value:e.replace(i,"\r\n")}})):{name:n.name,value:r.replace(i,"\r\n")}})).get()}}),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(2),n(46),n(60),n(100)],void 0===(o=function(e,t,n,r,o){"use strict";return e.parseHTML=function(i,a,s){return"string"!=typeof i?[]:("boolean"==typeof a&&(s=a,a=!1),a||(o.createHTMLDocument?((u=(a=t.implementation.createHTMLDocument("")).createElement("base")).href=t.location.href,a.head.appendChild(u)):a=t),l=!s&&[],(c=n.exec(i))?[a.createElement(c[1])]:(c=r([i],a,l),l&&l.length&&e(l).remove(),e.merge([],c.childNodes)));var u,c,l},e.parseHTML}.apply(t,r))||(e.exports=o)},function(e,t,n){"use strict";(function(e,t){var r=n(109),o=n(110);!function(){function e(){var e=window.pageYOffset||document.documentElement.scrollTop,t=window.innerWidth||document.body.clientWidth,n=document.getElementById("toc");e>250?t>1104?(n.style.position="fixed",n.style.left=document.getElementById("getting-started").getBoundingClientRect().left-230+"px"):t>760&&(n.style.position="fixed",n.style.left=document.getElementById("getting-started").getBoundingClientRect().left-210+"px"):(n.style.position="absolute",n.style.left="0")}window.onscroll=window.onresize=e,e()}();var i={Models:{}};i.Models.Docs={},i.Models.Apps={},i.Collections={},i.Views={},function(e,n){if(e){var r=e.LiveTOC=function(e){this.parent=e.parent,this.content=e.content,this.scrollContent=e.scrollContent||e.content,this.throttleInterval=e.throttleInterval||300,this.alignment=e.alignment||"center",this.onSelect=e.onSelect||null,this.currentItem=null,this._headerHeights={},this._sortedHeights=[],this.render(),e.parent&&this.attach(e.parent),this.initializeEventHandlers()};r.prototype={initializeEventHandlers:function(){var e=n.throttle(this.handleScroll.bind(this),this.throttleInterval);this.scrollContent===document.getElementsByTagName("body")[0]?document.addEventListener("scroll",e):this.scrollContent.addEventListener("scroll",e)},render:function(){this.scrollContent.style.position="relative",this.node=document.getElementsByClassName("ui_live_toc")[0],t(document).ready(function(e){this.updateHeights(),window.location.hash&&(this.hashChanged=!0),this.handleScroll()}.bind(this)),t(window).on("hashchange",function(){this.hashChanged=!0}.bind(this))},updateHeights:function(){for(var e={},t=[],n=this.content.querySelectorAll("h1, h2, h3"),r=0;rn);i++)o=this._sortedHeights[i];return this._headerHeights[o]},handleScroll:function(){var t;if(this.hashChanged?(this.hashChanged=!1,t=window.location.hash.replace("#","")):t=this.findBestLink(),null===this.currentItem||this.currentItem.getAttribute("data-name")!==t){for(var n=this.node.getElementsByTagName("li"),r=0;r=0,s=o.firstChild.className.indexOf(n.opt2)>=0,a&&t(o).addClass("language-"+n.opt1),s&&t(o).addClass("language-"+n.opt2),i=o):(a=o.className.indexOf(n.opt1)>=0,s=o.className.indexOf(n.opt2)>=0,i=t(o).find("pre.highlight").first()),a?i.append(n.renderToggle(!0)):s&&i.append(n.renderToggle(!1)),e.addClass(o,"has_toggles")}))})),t("."+this.opt2+"-toggle").on("click",this.showOpt2.bind(this)),t("."+this.opt1+"-toggle").on("click",this.showOpt1.bind(this)),this.toggleOpt(!0)},renderToggle:function(t){var n=e.tag("div",{className:"toggles"},[e.tag("div",{className:"toggle-item"},[e.tag("a",{className:this.opt1+"-toggle",href:"#"},this.label1)]),e.tag("div",{className:"toggle-item"},[e.tag("a",{className:this.opt2+"-toggle",href:"#"},this.label2)])]);return!0===t?e.addClass(n.childNodes[0],"selected"):e.addClass(n.childNodes[1],"selected"),n},showOpt1:function(e){e&&e.preventDefault(),t(".language-toggle .language-"+this.opt2).hide(),t(".language-toggle .language-"+this.opt1).show()},showOpt2:function(e){e&&e.preventDefault(),t(".language-toggle .language-"+this.opt2).show(),t(".language-toggle .language-"+this.opt1).hide()},toggleOpt:function(e){!0===e?(t(".language-toggle .language-"+this.opt2).hide(),t(".language-toggle .language-"+this.opt1).show()):(t(".language-toggle .language-"+this.opt2).show(),t(".language-toggle .language-"+this.opt1).hide()),this.onChange()}},n.extend(r.prototype,e.ComponentProto)}}(o,e),function(e,n){if(e){i.Views.Docs||(i.Views.Docs={});var r=i.Views.Docs.Main=function(e){this.platform=e.platform,this.language=e.language,this.render()};r.prototype={render:function(){this.scrollContent=document.getElementsByTagName("body")[0],"ios"===this.platform||"osx"===this.platform||"macos"===this.platform?new i.Views.Docs.Toggle({parent:this.scrollContent,opt1:"objective_c",opt2:"swift",label1:"Objective-C",label2:"Swift",onChange:this.handleToggleChange.bind(this)}):"rest"===this.platform&&new i.Views.Docs.Toggle({parent:this.scrollContent,opt1:"bash",opt2:"python",label1:"cURL",label2:"Python",onChange:this.handleToggleChange.bind(this)}),t(window).on("resize",n.throttle(this.handleWindowResize.bind(this),300)),t(window).on("load",function(){this.toc&&this.toc.updateHeights()}.bind(this)),t(function(){this.toc=new e.LiveTOC({parent:document.getElementById("toc"),scrollContent:this.scrollContent,content:document.getElementsByClassName("guide_content")[0]}),this.setupServerFieldCustomization(),this.mobileToc=document.getElementById("mobile_toc").getElementsByTagName("select")[0],this.renderMobileTOC(),this.handleWindowResize()}.bind(this))},renderMobileTOC:function(){for(var t=this.scrollContent.getElementsByTagName("h1"),n=document.createDocumentFragment(),r=0;r/g,">").replace(/"/g,"""),t(".custom-parse-server-appid").html(e),"undefined"!=typeof Storage&&localStorage.setItem("parse-server-custom-appid",e))})),t("#parse-server-custom-masterkey").keyup((function(){var e=t("#parse-server-custom-masterkey").val();e.match(/^[^\s]+$/i)&&(e=e.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),t(".custom-parse-server-masterkey").html(e),"undefined"!=typeof Storage&&localStorage.setItem("parse-server-custom-masterkey",e))})),t("#parse-server-custom-clientkey").keyup((function(){var e=t("#parse-server-custom-clientkey").val();e.match(/^[^\s]+$/i)&&(e=e.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),t(".custom-parse-server-clientkey").html(e),"undefined"!=typeof Storage&&localStorage.setItem("parse-server-custom-clientkey",e))})),t("#parse-server-custom-restapikey").keyup((function(){var e=t("#parse-server-custom-restapikey").val();e.match(/^[^\s]+$/i)&&(e=e.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),t(".custom-parse-server-restapikey").html(e),"undefined"!=typeof Storage&&localStorage.setItem("parse-server-custom-restapikey",e))})),t("#parse-server-custom-values-reset").click((function(){var e=t("#parse-server-custom-url").attr("defaultval");t(".custom-parse-server-url").html(e),t("#parse-server-custom-url").val(e),localStorage.setItem("parse-server-custom-url",e),e=t("#parse-server-custom-mount").attr("defaultval"),t(".custom-parse-server-mount").html("/"+e+"/"),t("#parse-server-custom-mount").val(e),localStorage.setItem("parse-server-custom-mount","/"+e+"/"),e=t("#parse-server-custom-protocol").attr("defaultval"),t(".custom-parse-server-protocol").html(e),t("#parse-server-custom-protocol").val(e),localStorage.setItem("parse-server-custom-protocol",e),e=t("#parse-server-custom-appid").attr("defaultval"),t(".custom-parse-server-appid").html(e),t("#parse-server-custom-appid").val(e),localStorage.setItem("parse-server-custom-appid",e),e=t("#parse-server-custom-masterkey").attr("defaultval"),t(".custom-parse-server-masterkey").html(e),t("#parse-server-custom-masterkey").val(e),localStorage.setItem("parse-server-custom-masterkey",e),e=t("#parse-server-custom-clientkey").attr("defaultval"),t(".custom-parse-server-clientkey").html(e),t("#parse-server-custom-clientkey").val(e),localStorage.setItem("parse-server-custom-clientkey",e),e=t("#parse-server-custom-restapikey").attr("defaultval"),t(".parse-server-custom-restapikey").html(e),t("#parse-server-custom-restapikey").val(e),localStorage.setItem("parse-server-custom-restapikey",e)}))}},handleToggleChange:function(){this.toc&&this.toc.updateHeights()},handleSelectChange:function(e){location.href=this.mobileToc.selectedOptions[0].getAttribute("data-anchor")},handleWindowResize:function(e){this.toc&&this.toc.updateHeights()}},n.extend(r.prototype,e.ComponentProto)}}(o,e);var a=window.location.pathname.split("/")[1];a&&new i.Views.Docs.Main({language:"en",platform:a}),t((function(){r.init({offset:2500,throttle:250,unload:!1,callback:function(e,t){}})}))}).call(this,n(72),n(38))},function(e,t,n){var r;(function(){var n=this,o=n._,i=Array.prototype,a=Object.prototype,s=Function.prototype,u=i.push,c=i.slice,l=a.toString,f=a.hasOwnProperty,p=Array.isArray,d=Object.keys,h=s.bind,v=Object.create,g=function(){},m=function(e){return e instanceof m?e:this instanceof m?void(this._wrapped=e):new m(e)};e.exports&&(t=e.exports=m),t._=m,m.VERSION="1.8.3";var y=function(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)};case 4:return function(n,r,o,i){return e.call(t,n,r,o,i)}}return function(){return e.apply(t,arguments)}},x=function(e,t,n){return null==e?m.identity:m.isFunction(e)?y(e,t,n):m.isObject(e)?m.matcher(e):m.property(e)};m.iteratee=function(e,t){return x(e,t,1/0)};var b=function(e,t){return function(n){var r=arguments.length;if(r<2||null==n)return n;for(var o=1;o=0&&t<=T};function E(e){function t(t,n,r,o,i,a){for(;i>=0&&i0?0:s-1;return arguments.length<3&&(o=n[a?a[u]:u],u+=e),t(n,r,o,a,u,s)}}m.each=m.forEach=function(e,t,n){var r,o;if(t=y(t,n),k(e))for(r=0,o=e.length;r=0},m.invoke=function(e,t){var n=c.call(arguments,2),r=m.isFunction(t);return m.map(e,(function(e){var o=r?t:e[t];return null==o?o:o.apply(e,n)}))},m.pluck=function(e,t){return m.map(e,m.property(t))},m.where=function(e,t){return m.filter(e,m.matcher(t))},m.findWhere=function(e,t){return m.find(e,m.matcher(t))},m.max=function(e,t,n){var r,o,i=-1/0,a=-1/0;if(null==t&&null!=e)for(var s=0,u=(e=k(e)?e:m.values(e)).length;si&&(i=r);else t=x(t,n),m.each(e,(function(e,n,r){((o=t(e,n,r))>a||o===-1/0&&i===-1/0)&&(i=e,a=o)}));return i},m.min=function(e,t,n){var r,o,i=1/0,a=1/0;if(null==t&&null!=e)for(var s=0,u=(e=k(e)?e:m.values(e)).length;sr||void 0===n)return 1;if(n0?0:o-1;i>=0&&i0?a=i>=0?i:Math.max(i+s,a):s=i>=0?Math.min(i+1,s):i+s+1;else if(n&&i&&s)return r[i=n(r,o)]===o?i:-1;if(o!=o)return(i=t(c.call(r,a,s),m.isNaN))>=0?i+a:-1;for(i=e>0?a:s-1;i>=0&&it?(a&&(clearTimeout(a),a=null),s=c,i=e.apply(r,o),a||(r=o=null)):a||!1===n.trailing||(a=setTimeout(u,l)),i}},m.debounce=function(e,t,n){var r,o,i,a,s,u=function(){var c=m.now()-a;c=0?r=setTimeout(u,t-c):(r=null,n||(s=e.apply(i,o),r||(i=o=null)))};return function(){i=this,o=arguments,a=m.now();var c=n&&!r;return r||(r=setTimeout(u,t)),c&&(s=e.apply(i,o),i=o=null),s}},m.wrap=function(e,t){return m.partial(t,e)},m.negate=function(e){return function(){return!e.apply(this,arguments)}},m.compose=function(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}},m.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},m.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},m.once=m.partial(m.before,2);var L=!{toString:null}.propertyIsEnumerable("toString"),q=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];function _(e,t){var n=q.length,r=e.constructor,o=m.isFunction(r)&&r.prototype||a,i="constructor";for(m.has(e,i)&&!m.contains(t,i)&&t.push(i);n--;)(i=q[n])in e&&e[i]!==o[i]&&!m.contains(t,i)&&t.push(i)}m.keys=function(e){if(!m.isObject(e))return[];if(d)return d(e);var t=[];for(var n in e)m.has(e,n)&&t.push(n);return L&&_(e,t),t},m.allKeys=function(e){if(!m.isObject(e))return[];var t=[];for(var n in e)t.push(n);return L&&_(e,t),t},m.values=function(e){for(var t=m.keys(e),n=t.length,r=Array(n),o=0;o":">",'"':""","'":"'","`":"`"},M=m.invert(H),P=function(e){var t=function(t){return e[t]},n="(?:"+m.keys(e).join("|")+")",r=RegExp(n),o=RegExp(n,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(o,t):e}};m.escape=P(H),m.unescape=P(M),m.result=function(e,t,n){var r=null==e?void 0:e[t];return void 0===r&&(r=n),m.isFunction(r)?r.call(e):r};var R=0;m.uniqueId=function(e){var t=++R+"";return e?e+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var B=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},W=/\\|'|\r|\n|\u2028|\u2029/g,$=function(e){return"\\"+F[e]};m.template=function(e,t,n){!t&&n&&(t=n),t=m.defaults({},t,m.templateSettings);var r=RegExp([(t.escape||B).source,(t.interpolate||B).source,(t.evaluate||B).source].join("|")+"|$","g"),o=0,i="__p+='";e.replace(r,(function(t,n,r,a,s){return i+=e.slice(o,s).replace(W,$),o=s+t.length,n?i+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?i+="'+\n((__t=("+r+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t})),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(e){throw e.source=i,e}var s=function(e){return a.call(this,e,m)},u=t.variable||"obj";return s.source="function("+u+"){\n"+i+"}",s},m.chain=function(e){var t=m(e);return t._chain=!0,t};var z=function(e,t){return e._chain?m(t).chain():t};m.mixin=function(e){m.each(m.functions(e),(function(t){var n=m[t]=e[t];m.prototype[t]=function(){var e=[this._wrapped];return u.apply(e,arguments),z(this,n.apply(m,e))}}))},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=i[e];m.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],z(this,n)}})),m.each(["concat","join","slice"],(function(e){var t=i[e];m.prototype[e]=function(){return z(this,t.apply(this._wrapped,arguments))}})),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},void 0===(r=function(){return m}.apply(t,[]))||(e.exports=r)}).call(this)},function(e,t,n){var r,o;r=[n(43)],void 0===(o=function(e){"use strict";return e.call(Object)}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(75)],void 0===(o=function(e,t){"use strict";e.find=t,e.expr=t.selectors,e.expr[":"]=e.expr.pseudos,e.uniqueSort=e.unique=t.uniqueSort,e.text=t.getText,e.isXMLDoc=t.isXML,e.contains=t.contains,e.escapeSelector=t.escape}.apply(t,r))||(e.exports=o)},function(e,t,n){var r; -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */!function(o){var i,a,s,u,c,l,f,p,d,h,v,g,m,y,x,b,w,C,T,S="sizzle"+1*new Date,k=o.document,E=0,A=0,N=pe(),j=pe(),D=pe(),O=pe(),L=function(e,t){return e===t&&(v=!0),0},q={}.hasOwnProperty,_=[],I=_.pop,H=_.push,M=_.push,P=_.slice,R=function(e,t){for(var n=0,r=e.length;n+~]|"+F+")"+F+"*"),Y=new RegExp(F+"|>"),G=new RegExp(z),J=new RegExp("^"+W+"$"),Q={ID:new RegExp("^#("+W+")"),CLASS:new RegExp("^\\.("+W+")"),TAG:new RegExp("^("+W+"|[*])"),ATTR:new RegExp("^"+$),PSEUDO:new RegExp("^"+z),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+F+"*(even|odd|(([+-]|)(\\d*)n|)"+F+"*(?:([+-]|)"+F+"*(\\d+)|))"+F+"*\\)|)","i"),bool:new RegExp("^(?:"+B+")$","i"),needsContext:new RegExp("^"+F+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+F+"*((?:-\\d)?\\d*)"+F+"*\\)|)(?=[^-]|$)","i")},Z=/HTML$/i,ee=/^(?:input|select|textarea|button)$/i,te=/^h\d$/i,ne=/^[^{]+\{\s*\[native \w/,re=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,oe=/[+~]/,ie=new RegExp("\\\\[\\da-fA-F]{1,6}"+F+"?|\\\\([^\\r\\n\\f])","g"),ae=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},se=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ue=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ce=function(){g()},le=Se((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{M.apply(_=P.call(k.childNodes),k.childNodes),_[k.childNodes.length].nodeType}catch(e){M={apply:_.length?function(e,t){H.apply(e,P.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function fe(e,t,n,r){var o,i,s,u,c,f,d,h=t&&t.ownerDocument,v=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==v&&9!==v&&11!==v)return n;if(!r&&(g(t),t=t||m,x)){if(11!==v&&(c=re.exec(e)))if(o=c[1]){if(9===v){if(!(s=t.getElementById(o)))return n;if(s.id===o)return n.push(s),n}else if(h&&(s=h.getElementById(o))&&T(t,s)&&s.id===o)return n.push(s),n}else{if(c[2])return M.apply(n,t.getElementsByTagName(e)),n;if((o=c[3])&&a.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(o)),n}if(a.qsa&&!O[e+" "]&&(!b||!b.test(e))&&(1!==v||"object"!==t.nodeName.toLowerCase())){if(d=e,h=t,1===v&&(Y.test(e)||K.test(e))){for((h=oe.test(e)&&we(t.parentNode)||t)===t&&a.scope||((u=t.getAttribute("id"))?u=u.replace(se,ue):t.setAttribute("id",u=S)),i=(f=l(e)).length;i--;)f[i]=(u?"#"+u:":scope")+" "+Te(f[i]);d=f.join(",")}try{return M.apply(n,h.querySelectorAll(d)),n}catch(t){O(e,!0)}finally{u===S&&t.removeAttribute("id")}}}return p(e.replace(U,"$1"),t,n,r)}function pe(){var e=[];return function t(n,r){return e.push(n+" ")>s.cacheLength&&delete t[e.shift()],t[n+" "]=r}}function de(e){return e[S]=!0,e}function he(e){var t=m.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ve(e,t){for(var n=e.split("|"),r=n.length;r--;)s.attrHandle[n[r]]=t}function ge(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function me(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function ye(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function xe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&le(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function be(e){return de((function(t){return t=+t,de((function(n,r){for(var o,i=e([],n.length,t),a=i.length;a--;)n[o=i[a]]&&(n[o]=!(r[o]=n[o]))}))}))}function we(e){return e&&void 0!==e.getElementsByTagName&&e}for(i in a=fe.support={},c=fe.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Z.test(t||n&&n.nodeName||"HTML")},g=fe.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:k;return r!=m&&9===r.nodeType&&r.documentElement?(y=(m=r).documentElement,x=!c(m),k!=m&&(n=m.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",ce,!1):n.attachEvent&&n.attachEvent("onunload",ce)),a.scope=he((function(e){return y.appendChild(e).appendChild(m.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),a.attributes=he((function(e){return e.className="i",!e.getAttribute("className")})),a.getElementsByTagName=he((function(e){return e.appendChild(m.createComment("")),!e.getElementsByTagName("*").length})),a.getElementsByClassName=ne.test(m.getElementsByClassName),a.getById=he((function(e){return y.appendChild(e).id=S,!m.getElementsByName||!m.getElementsByName(S).length})),a.getById?(s.filter.ID=function(e){var t=e.replace(ie,ae);return function(e){return e.getAttribute("id")===t}},s.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n=t.getElementById(e);return n?[n]:[]}}):(s.filter.ID=function(e){var t=e.replace(ie,ae);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},s.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n,r,o,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),s.find.TAG=a.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):a.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},s.find.CLASS=a.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&x)return t.getElementsByClassName(e)},w=[],b=[],(a.qsa=ne.test(m.querySelectorAll))&&(he((function(e){var t;y.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&b.push("[*^$]="+F+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||b.push("\\["+F+"*(?:value|"+B+")"),e.querySelectorAll("[id~="+S+"-]").length||b.push("~="),(t=m.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||b.push("\\["+F+"*name"+F+"*="+F+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||b.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||b.push(".#.+[+~]"),e.querySelectorAll("\\\f"),b.push("[\\r\\n\\f]")})),he((function(e){e.innerHTML="";var t=m.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&b.push("name"+F+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&b.push(":enabled",":disabled"),y.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&b.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),b.push(",.*:")}))),(a.matchesSelector=ne.test(C=y.matches||y.webkitMatchesSelector||y.mozMatchesSelector||y.oMatchesSelector||y.msMatchesSelector))&&he((function(e){a.disconnectedMatch=C.call(e,"*"),C.call(e,"[s!='']:x"),w.push("!=",z)})),b=b.length&&new RegExp(b.join("|")),w=w.length&&new RegExp(w.join("|")),t=ne.test(y.compareDocumentPosition),T=t||ne.test(y.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},L=t?function(e,t){if(e===t)return v=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!a.sortDetached&&t.compareDocumentPosition(e)===n?e==m||e.ownerDocument==k&&T(k,e)?-1:t==m||t.ownerDocument==k&&T(k,t)?1:h?R(h,e)-R(h,t):0:4&n?-1:1)}:function(e,t){if(e===t)return v=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],s=[t];if(!o||!i)return e==m?-1:t==m?1:o?-1:i?1:h?R(h,e)-R(h,t):0;if(o===i)return ge(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?ge(a[r],s[r]):a[r]==k?-1:s[r]==k?1:0},m):m},fe.matches=function(e,t){return fe(e,null,null,t)},fe.matchesSelector=function(e,t){if(g(e),a.matchesSelector&&x&&!O[t+" "]&&(!w||!w.test(t))&&(!b||!b.test(t)))try{var n=C.call(e,t);if(n||a.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){O(t,!0)}return fe(t,m,null,[e]).length>0},fe.contains=function(e,t){return(e.ownerDocument||e)!=m&&g(e),T(e,t)},fe.attr=function(e,t){(e.ownerDocument||e)!=m&&g(e);var n=s.attrHandle[t.toLowerCase()],r=n&&q.call(s.attrHandle,t.toLowerCase())?n(e,t,!x):void 0;return void 0!==r?r:a.attributes||!x?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},fe.escape=function(e){return(e+"").replace(se,ue)},fe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},fe.uniqueSort=function(e){var t,n=[],r=0,o=0;if(v=!a.detectDuplicates,h=!a.sortStable&&e.slice(0),e.sort(L),v){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return h=null,e},u=fe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=u(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=u(t);return n},(s=fe.selectors={cacheLength:50,createPseudo:de,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ie,ae),e[3]=(e[3]||e[4]||e[5]||"").replace(ie,ae),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||fe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&fe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&G.test(n)&&(t=l(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ie,ae).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=new RegExp("(^|"+F+")"+e+"("+F+"|$)"))&&N(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var o=fe.attr(r,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&o.indexOf(n)>-1:"$="===t?n&&o.slice(-n.length)===n:"~="===t?(" "+o.replace(V," ")+" ").indexOf(n)>-1:"|="===t&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,d,h,v=i!==a?"nextSibling":"previousSibling",g=t.parentNode,m=s&&t.nodeName.toLowerCase(),y=!u&&!s,x=!1;if(g){if(i){for(;v;){for(p=t;p=p[v];)if(s?p.nodeName.toLowerCase()===m:1===p.nodeType)return!1;h=v="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(x=(d=(c=(l=(f=(p=g)[S]||(p[S]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===E&&c[1])&&c[2],p=d&&g.childNodes[d];p=++d&&p&&p[v]||(x=d=0)||h.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[E,d,x];break}}else if(y&&(x=d=(c=(l=(f=(p=t)[S]||(p[S]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===E&&c[1]),!1===x)for(;(p=++d&&p&&p[v]||(x=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==m:1!==p.nodeType)||!++x||(y&&((l=(f=p[S]||(p[S]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[E,x]),p!==t)););return(x-=o)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,r=s.pseudos[e]||s.setFilters[e.toLowerCase()]||fe.error("unsupported pseudo: "+e);return r[S]?r(t):r.length>1?(n=[e,e,"",t],s.setFilters.hasOwnProperty(e.toLowerCase())?de((function(e,n){for(var o,i=r(e,t),a=i.length;a--;)e[o=R(e,i[a])]=!(n[o]=i[a])})):function(e){return r(e,0,n)}):r}},pseudos:{not:de((function(e){var t=[],n=[],r=f(e.replace(U,"$1"));return r[S]?de((function(e,t,n,o){for(var i,a=r(e,null,o,[]),s=e.length;s--;)(i=a[s])&&(e[s]=!(t[s]=i))})):function(e,o,i){return t[0]=e,r(t,null,i,n),t[0]=null,!n.pop()}})),has:de((function(e){return function(t){return fe(e,t).length>0}})),contains:de((function(e){return e=e.replace(ie,ae),function(t){return(t.textContent||u(t)).indexOf(e)>-1}})),lang:de((function(e){return J.test(e||"")||fe.error("unsupported lang: "+e),e=e.replace(ie,ae).toLowerCase(),function(t){var n;do{if(n=x?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(e){var t=o.location&&o.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===y},focus:function(e){return e===m.activeElement&&(!m.hasFocus||m.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:xe(!1),disabled:xe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!s.pseudos.empty(e)},header:function(e){return te.test(e.nodeName)},input:function(e){return ee.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:be((function(){return[0]})),last:be((function(e,t){return[t-1]})),eq:be((function(e,t,n){return[n<0?n+t:n]})),even:be((function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e})),gt:be((function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function Ee(e,t,n,r,o){for(var i,a=[],s=0,u=e.length,c=null!=t;s-1&&(i[c]=!(a[c]=f))}}else m=Ee(m===a?m.splice(h,m.length):m),o?o(null,a,m,u):M.apply(a,m)}))}function Ne(e){for(var t,n,r,o=e.length,i=s.relative[e[0].type],a=i||s.relative[" "],u=i?1:0,c=Se((function(e){return e===t}),a,!0),l=Se((function(e){return R(t,e)>-1}),a,!0),f=[function(e,n,r){var o=!i&&(r||n!==d)||((t=n).nodeType?c(e,n,r):l(e,n,r));return t=null,o}];u1&&ke(f),u>1&&Te(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(U,"$1"),n,u0,r=e.length>0,o=function(o,i,a,u,c){var l,f,p,h=0,v="0",y=o&&[],b=[],w=d,C=o||r&&s.find.TAG("*",c),T=E+=null==w?1:Math.random()||.1,S=C.length;for(c&&(d=i==m||i||c);v!==S&&null!=(l=C[v]);v++){if(r&&l){for(f=0,i||l.ownerDocument==m||(g(l),a=!x);p=e[f++];)if(p(l,i||m,a)){u.push(l);break}c&&(E=T)}n&&((l=!p&&l)&&h--,o&&y.push(l))}if(h+=v,n&&v!==h){for(f=0;p=t[f++];)p(y,b,i,a);if(o){if(h>0)for(;v--;)y[v]||b[v]||(b[v]=I.call(u));b=Ee(b)}M.apply(u,b),c&&!o&&b.length>0&&h+t.length>1&&fe.uniqueSort(u)}return c&&(E=T,d=w),y};return n?de(o):o}(o,r))).selector=e}return i},p=fe.select=function(e,t,n,r){var o,i,a,u,c,p="function"==typeof e&&e,d=!r&&l(e=p.selector||e);if(n=n||[],1===d.length){if((i=d[0]=d[0].slice(0)).length>2&&"ID"===(a=i[0]).type&&9===t.nodeType&&x&&s.relative[i[1].type]){if(!(t=(s.find.ID(a.matches[0].replace(ie,ae),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=Q.needsContext.test(e)?0:i.length;o--&&(a=i[o],!s.relative[u=a.type]);)if((c=s.find[u])&&(r=c(a.matches[0].replace(ie,ae),oe.test(i[0].type)&&we(t.parentNode)||t))){if(i.splice(o,1),!(e=r.length&&Te(i)))return M.apply(n,r),n;break}}return(p||f(e,d))(r,t,!x,n,!t||oe.test(e)&&we(t.parentNode)||t),n},a.sortStable=S.split("").sort(L).join("")===S,a.detectDuplicates=!!v,g(),a.sortDetached=he((function(e){return 1&e.compareDocumentPosition(m.createElement("fieldset"))})),he((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||ve("type|href|height|width",(function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),a.attributes&&he((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||ve("value",(function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),he((function(e){return null==e.getAttribute("disabled")}))||ve(B,(function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}));var je=o.Sizzle;fe.noConflict=function(){return o.Sizzle===fe&&(o.Sizzle=je),fe},void 0===(r=function(){return fe}.call(t,n,t,e))||(e.exports=r)}(window)},function(e,t,n){var r,o;r=[n(0)],void 0===(o=function(e){"use strict";return function(t,n,r){for(var o=[],i=void 0!==r;(t=t[n])&&9!==t.nodeType;)if(1===t.nodeType){if(i&&e(t).is(r))break;o.push(t)}return o}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(13)],void 0===(o=function(e){"use strict";var t=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;e.Deferred.exceptionHook=function(e,n){window.console&&window.console.warn&&e&&t.test(e.name)&&window.console.warn("jQuery.Deferred exception: "+e.message,e.stack,n)}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0)],void 0===(o=function(e){"use strict";e.readyException=function(e){window.setTimeout((function(){throw e}))}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(9),n(17),n(5),n(50)],void 0===(o=function(e,t,n,r,o){"use strict";var i=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,a=/[A-Z]/g;function s(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(a,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=function(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:i.test(e)?JSON.parse(e):e)}(n)}catch(e){}o.set(e,t,n)}else n=void 0;return n}return e.extend({hasData:function(e){return o.hasData(e)||r.hasData(e)},data:function(e,t,n){return o.access(e,t,n)},removeData:function(e,t){o.remove(e,t)},_data:function(e,t,n){return r.access(e,t,n)},_removeData:function(e,t){r.remove(e,t)}}),e.fn.extend({data:function(e,i){var a,u,c,l=this[0],f=l&&l.attributes;if(void 0===e){if(this.length&&(c=o.get(l),1===l.nodeType&&!r.get(l,"hasDataAttrs"))){for(a=f.length;a--;)f[a]&&0===(u=f[a].name).indexOf("data-")&&(u=n(u.slice(5)),s(l,u,c[u]));r.set(l,"hasDataAttrs",!0)}return c}return"object"==typeof e?this.each((function(){o.set(this,e)})):t(this,(function(t){var n;if(l&&void 0===t)return void 0!==(n=o.get(l,e))?n:void 0!==(n=s(l,e))?n:void 0;this.each((function(){o.set(this,e,t)}))}),null,i,arguments.length>1,null,!0)},removeData:function(e){return this.each((function(){o.remove(this,e)}))}}),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(28),n(29)],void 0===(o=function(e){"use strict";return e.fn.delay=function(t,n){return t=e.fx&&e.fx.speeds[t]||t,n=n||"fx",this.queue(n,(function(e,n){var r=window.setTimeout(e,t);n.stop=function(){window.clearTimeout(r)}}))},e.fn.delay}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(5),n(52)],void 0===(o=function(e,t,n){"use strict";var r={};function o(t){var n,o=t.ownerDocument,i=t.nodeName,a=r[i];return a||(n=o.body.appendChild(o.createElement(i)),a=e.css(n,"display"),n.parentNode.removeChild(n),"none"===a&&(a="block"),r[i]=a,a)}function i(e,r){for(var i,a,s=[],u=0,c=e.length;u1)},removeAttr:function(t){return this.each((function(){e.removeAttr(this,t)}))}}),e.extend({attr:function(t,n,r){var o,a,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return void 0===t.getAttribute?e.prop(t,n,r):(1===s&&e.isXMLDoc(t)||(a=e.attrHooks[n.toLowerCase()]||(e.expr.match.bool.test(n)?i:void 0)),void 0!==r?null===r?void e.removeAttr(t,n):a&&"set"in a&&void 0!==(o=a.set(t,r,n))?o:(t.setAttribute(n,r+""),r):a&&"get"in a&&null!==(o=a.get(t,n))?o:null==(o=e.find.attr(t,n))?void 0:o)},attrHooks:{type:{set:function(e,t){if(!r.radioValue&&"radio"===t&&n(e,"input")){var o=e.value;return e.setAttribute("type",t),o&&(e.value=o),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(o);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),i={set:function(t,n,r){return!1===n?e.removeAttr(t,r):t.setAttribute(r,r),r}},e.each(e.expr.match.bool.source.match(/\w+/g),(function(t,n){var r=a[n]||e.find.attr;a[n]=function(e,t,n){var o,i,s=t.toLowerCase();return n||(i=a[s],a[s]=o,o=null!=r(e,t,n)?s:null,a[s]=i),o}}))}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(36),n(1),n(7),n(5),n(4)],void 0===(o=function(e,t,n,r,o){"use strict";function i(e){return e.getAttribute&&e.getAttribute("class")||""}function a(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(r)||[]}e.fn.extend({addClass:function(r){var o,s,u,c,l,f,p,d=0;if(n(r))return this.each((function(t){e(this).addClass(r.call(this,t,i(this)))}));if((o=a(r)).length)for(;s=this[d++];)if(c=i(s),u=1===s.nodeType&&" "+t(c)+" "){for(f=0;l=o[f++];)u.indexOf(" "+l+" ")<0&&(u+=l+" ");c!==(p=t(u))&&s.setAttribute("class",p)}return this},removeClass:function(r){var o,s,u,c,l,f,p,d=0;if(n(r))return this.each((function(t){e(this).removeClass(r.call(this,t,i(this)))}));if(!arguments.length)return this.attr("class","");if((o=a(r)).length)for(;s=this[d++];)if(c=i(s),u=1===s.nodeType&&" "+t(c)+" "){for(f=0;l=o[f++];)for(;u.indexOf(" "+l+" ")>-1;)u=u.replace(" "+l+" "," ");c!==(p=t(u))&&s.setAttribute("class",p)}return this},toggleClass:function(t,r){var s=typeof t,u="string"===s||Array.isArray(t);return"boolean"==typeof r&&u?r?this.addClass(t):this.removeClass(t):n(t)?this.each((function(n){e(this).toggleClass(t.call(this,n,i(this),r),r)})):this.each((function(){var n,r,c,l;if(u)for(r=0,c=e(this),l=a(t);n=l[r++];)c.hasClass(n)?c.removeClass(n):c.addClass(n);else void 0!==t&&"boolean"!==s||((n=i(this))&&o.set(this,"__className__",n),this.setAttribute&&this.setAttribute("class",n||!1===t?"":o.get(this,"__className__")||""))}))},hasClass:function(e){var n,r,o=0;for(n=" "+e+" ";r=this[o++];)if(1===r.nodeType&&(" "+t(i(r))+" ").indexOf(n)>-1)return!0;return!1}})}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(36),n(35),n(6),n(1),n(4)],void 0===(o=function(e,t,n,r,o){"use strict";var i=/\r/g;e.fn.extend({val:function(t){var n,r,a,s=this[0];return arguments.length?(a=o(t),this.each((function(r){var o;1===this.nodeType&&(null==(o=a?t.call(this,r,e(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=e.map(o,(function(e){return null==e?"":e+""}))),(n=e.valHooks[this.type]||e.valHooks[this.nodeName.toLowerCase()])&&"set"in n&&void 0!==n.set(this,o,"value")||(this.value=o))}))):s?(n=e.valHooks[s.type]||e.valHooks[s.nodeName.toLowerCase()])&&"get"in n&&void 0!==(r=n.get(s,"value"))?r:"string"==typeof(r=s.value)?r.replace(i,""):null==r?"":r:void 0}}),e.extend({valHooks:{option:{get:function(n){var r=e.find.attr(n,"value");return null!=r?r:t(e.text(n))}},select:{get:function(t){var n,o,i,a=t.options,s=t.selectedIndex,u="select-one"===t.type,c=u?null:[],l=u?s+1:a.length;for(i=s<0?l:u?s:0;i-1)&&(r=!0);return r||(t.selectedIndex=-1),a}}}}),e.each(["radio","checkbox"],(function(){e.valHooks[this]={set:function(t,n){if(Array.isArray(n))return t.checked=e.inArray(e(t).val(),n)>-1}},n.checkOn||(e.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}))}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(5),n(91),n(14),n(37)],void 0===(o=function(e,t,n){"use strict";return n.focusin||e.each({focus:"focusin",blur:"focusout"},(function(n,r){var o=function(t){e.event.simulate(r,t.target,e.event.fix(t))};e.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,i=t.access(e,r);i||e.addEventListener(n,o,!0),t.access(e,r,(i||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,i=t.access(e,r)-1;i?t.access(e,r,i):(e.removeEventListener(n,o,!0),t.remove(e,r))}}})),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(8)],void 0===(o=function(e){"use strict";return e.focusin="onfocusin"in window,e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(10)],void 0===(o=function(e){"use strict";return e._evalUrl=function(t,n,r){return e.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){e.globalEval(t,n,r)}})},e._evalUrl}.apply(t,r))||(e.exports=o)},function(e,t,n){var r;void 0===(r=function(){"use strict";return window.location}.call(t,n,t,e))||(e.exports=r)},function(e,t,n){var r,o;r=[n(0),n(1),n(4),n(24),n(12)],void 0===(o=function(e,t){"use strict";return e.fn.extend({wrapAll:function(n){var r;return this[0]&&(t(n)&&(n=n.call(this[0])),r=e(n,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&r.insertBefore(this[0]),r.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(n){return t(n)?this.each((function(t){e(this).wrapInner(n.call(this,t))})):this.each((function(){var t=e(this),r=t.contents();r.length?r.wrapAll(n):t.append(n)}))},wrap:function(n){var r=t(n);return this.each((function(t){e(this).wrapAll(r?n.call(this,t):n)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){e(this).replaceWith(this.childNodes)})),this}}),e}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(3)],void 0===(o=function(e){"use strict";e.expr.pseudos.hidden=function(t){return!e.expr.pseudos.visible(t)},e.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(8),n(10)],void 0===(o=function(e,t){"use strict";e.ajaxSettings.xhr=function(){try{return new window.XMLHttpRequest}catch(e){}};var n={0:200,1223:204},r=e.ajaxSettings.xhr();t.cors=!!r&&"withCredentials"in r,t.ajax=r=!!r,e.ajaxTransport((function(e){var o,i;if(t.cors||r&&!e.crossDomain)return{send:function(t,r){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||t["X-Requested-With"]||(t["X-Requested-With"]="XMLHttpRequest"),t)s.setRequestHeader(a,t[a]);o=function(e){return function(){o&&(o=i=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?r(0,"error"):r(s.status,s.statusText):r(n[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=o(),i=s.onerror=s.ontimeout=o("error"),void 0!==s.onabort?s.onabort=i:s.onreadystatechange=function(){4===s.readyState&&window.setTimeout((function(){o&&i()}))},o=o("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}))}.apply(t,r))||(e.exports=o)},function(e,t,n){var r,o;r=[n(0),n(2),n(10)],void 0===(o=function(e,t){"use strict";e.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),e.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return e.globalEval(t),t}}}),e.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),e.ajaxTransport("script",(function(n){var r,o;if(n.crossDomain||n.scriptAttrs)return{send:function(i,a){r=e(" - -

The more you know.

diff --git a/package-lock.json b/package-lock.json index 82f6f6b29..258def6d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6299 +4,4566 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "dev": true + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@babel/types": "^7.10.4" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "@babel/helper-compilation-targets": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.12.0", + "semver": "^5.5.0" } }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "dev": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" } }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "dev": true, "requires": { - "@xtuc/long": "4.2.2" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } } }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@babel/types": "^7.12.1" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@babel/types": "^7.10.4" } }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" + "@babel/types": "^7.10.4" } }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "@babel/types": "^7.12.1" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/types": "^7.12.1" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "@babel/types": "^7.10.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "lodash": "^4.17.19" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "@babel/types": "^7.12.1" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } + "@babel/types": "^7.11.0" } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", "dev": true }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@babel/helpers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "color-convert": "^1.9.0" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "color-name": "1.1.3" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz", - "integrity": "sha1-Q5iRDDWEQdxM7xh4cmTQQS7Tazc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.23.0.tgz", - "integrity": "sha1-I+iS9/LnWWeOteREao+OlOgbNHA=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.23.0", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - }, - "dependencies": { - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-react": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.11.1.tgz", - "integrity": "sha1-mKwr08G3bzBirgglgOreFUoZtZA=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.3.13", - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-flow-strip-types": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.3.13", - "babel-plugin-transform-react-jsx": "^6.3.13", - "babel-plugin-transform-react-jsx-self": "^6.11.0", - "babel-plugin-transform-react-jsx-source": "^6.3.13" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "babel-types": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz", - "integrity": "sha1-uxcXnXU4utOM0MnhFdNA935+ms8=", + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dev": true, - "optional": true, "requires": { - "file-uri-to-path": "1.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "dev": true, "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { - "pako": "~1.0.5" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "ci-info": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.4.0.tgz", - "integrity": "sha512-Oqmw2pVfCl8sCL+1QgMywPfdxPJPkC51y4usw0iiE2S9qnEOAqXy8bwl1CpMpnoU39g4iKJTz6QZj+28FvOnjQ==", - "dev": true + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "@babel/helper-plugin-utils": "^7.10.4" } }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "dev": true, "requires": { - "color-name": "1.1.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "dev": true, "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "dev": true, "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "dev": true, "requires": { - "ms": "2.0.0" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, "requires": { - "repeating": "^2.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" } }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "dev": true, "requires": { - "once": "^1.4.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "regenerator-transform": "^0.14.2" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + } } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "dev": true, "requires": { - "prr": "~1.0.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "regenerator-runtime": "^0.13.4" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "ms": "2.1.2" } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true } } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", "dev": true, - "optional": true + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "@types/eslint": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz", + "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "@types/estree": "*", + "@types/json-schema": "*" } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "@types/eslint": "*", + "@types/estree": "*" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/node": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.1.tgz", + "integrity": "sha512-D2/Xwp9c49JhIWq7SIrdvoYyGdq6yXkr5FTldN4rus9XljYFBul6P2epAID8xepOpL4ffcx09C05FZGK/1AIkw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "@webassemblyjs/wast-printer": "1.9.0" } }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "@webassemblyjs/ast": "1.9.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "@xtuc/long": "4.2.2" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, - "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/info": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.0.2.tgz", + "integrity": "sha512-FEfLQwmN4pXZSYSrtp+KC84rFanoCIxXFpS2wUvviDCE2fnajwxw2GXzbj83IlH4Dl8Wq8kJjavVwvxv3YJmnw==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.0.1.tgz", + "integrity": "sha512-WGMaTMTK6NOe29Hw1WBEok9vGLfKg5C6jWzNOS/6HH1YadR+RL+TRWRcSyc81Dzulljhk/Ree9mrDM4Np9GGOQ==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-back": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", + "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, - "optional": true, "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "rc": { - "version": "1.2.8", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, - "optional": true + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } } } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "rimraf": { - "version": "2.7.1", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "glob": "^7.1.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, - "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "tar": { - "version": "4.4.13", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, - "optional": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "minimist": "^1.2.5" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true } } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", "dev": true }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "babel-runtime": "^6.22.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true } } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "global-prefix": "^3.0.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true } } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "babel-runtime": "^6.22.0" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "babel-runtime": "^6.22.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "husky": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.0.0-rc.13.tgz", - "integrity": "sha512-ZNNoaBgfOHRA05UHS/etBoWFDu65mjPoohPYQwOqb5155KOovBp8LMkMoNK0kn3VYdsm+HWdtuHbD4XjfzlfpQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.2", - "execa": "^0.9.0", - "find-up": "^3.0.0", - "get-stdin": "^6.0.0", - "is-ci": "^1.1.0", - "pkg-dir": "^3.0.0", - "please-upgrade-node": "^3.1.1", - "read-pkg": "^4.0.1", - "run-node": "^1.0.0", - "slash": "^2.0.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", - "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true } } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "p-try": "^2.0.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true } } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, - "is-ci": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.0.tgz", - "integrity": "sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw==", + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "ci-info": "^1.3.0" + "babel-runtime": "^6.22.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "babel-runtime": "^6.22.0" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "babel-runtime": "^6.22.0" } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "isobject": "^3.0.1" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "jquery": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", - "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "babel-runtime": "^6.22.0" } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "regenerator-transform": "^0.10.0" } }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "pify": "^3.0.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "p-defer": "^1.0.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "babel-types": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz", + "integrity": "sha1-uxcXnXU4utOM0MnhFdNA935+ms8=", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "babel-runtime": "^6.22.0", + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^1.0.1" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "minimist": "0.0.8" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "tslib": "^1.9.0" } }, - "ms": { + "ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "color-name": "~1.1.4" } }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "command-line-usage": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.0.tgz", + "integrity": "sha512-Ew1clU4pkUeo6AFVDFxCbnN7GIZfXl48HIOQeFQnkO3oOqvpI7wdqtLRwv9iOCZ/7A+z4csVZeiDdEcj8g6Wiw==", + "dev": true, + "requires": { + "array-back": "^4.0.0", + "chalk": "^2.4.2", + "table-layout": "^1.0.0", + "typical": "^5.2.0" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { + "commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "core-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "browserslist": "^4.8.5", + "semver": "7.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true } } }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "isobject": "^3.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "isobject": "^3.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "wrappy": "1" + "ms": "2.0.0" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "object-keys": "^1.0.12" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "p-try": "^1.0.0" + "once": "^1.4.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "enhanced-resolve": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.0.tgz", + "integrity": "sha512-EENz3E701+77g0wfbOITeI8WLPNso2kQNMBIBEi/TH/BEa9YXtS01X7sIEk5XXsfFq1jNkhIpu08hBPH1TRLIQ==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", "dev": true }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "is-arrayish": "^0.2.1" } }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, - "pify": { + "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", "dev": true, "requires": { - "find-up": "^2.1.0" + "semver-regex": "^2.0.0" } }, - "please-upgrade-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", - "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { - "semver-compare": "^1.0.0" + "pump": "^3.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "process-nextick-args": { + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "prr": { + "has-symbols": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "husky": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "loose-envify": "^1.0.0" } }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "has": "^1.0.3" } }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, - "regenerator-runtime": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", - "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", "dev": true }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "has-symbols": "^1.0.1" } }, - "regexpu-core": { + "is-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "has-symbols": "^1.0.1" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", "dev": true, "requires": { - "jsesc": "~0.5.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", + "dev": true }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "minimist": "^1.2.0" } } } }, - "resolve-from": { + "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "glob": "^7.1.3" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "run-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", - "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "aproba": "^1.1.1" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "mime-db": "1.44.0" } }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "path-key": "^3.0.0" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "wrappy": "1" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "mimic-fn": "^2.1.0" } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "p-try": "^2.0.0" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "p-limit": "^2.0.0" } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "callsites": "^3.0.0" } }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { - "source-map": "^0.5.6" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "spdx-correct": { + "pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "find-up": "^3.0.0" } }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "semver-compare": "^1.0.0" } }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "safe-buffer": "^5.1.0" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "resolve": "^1.9.0" } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "regenerate": "^1.4.0" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "regenerator-runtime": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "jsesc": "~0.5.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "terser": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", - "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "randombytes": "^2.1.0" } }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "shebang-regex": "^3.0.0" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "string.prototype.trimend": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "string.prototype.trimstart": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "union-value": { + "table-layout": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", + "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } + "tapable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz", + "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==", + "dev": true }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "terser": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + } } }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "terser-webpack-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.0.tgz", + "integrity": "sha512-rf7l5a9xamIVX3enQeTl0MY2MNeZClo5yPX/tVPy22oY0nzu0b45h7JqyFi/bygqKWtzXMnml0u12mArhQPsBQ==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.5" }, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } + "p-try": "^2.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "to-fast-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", + "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", "dev": true }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "url": { + "type-fest": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "inherits": "2.0.3" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "punycode": "^2.1.0" } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.0.tgz", + "integrity": "sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg==", "dev": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.1.3.tgz", + "integrity": "sha512-bNBF5EOpt5a6NeCBFu0+8KJtG61cVmOb2b/a5tPNRLz3OWgDpHMbmnDkaSm3nf/UQ6ufw4PWYGVsVOAi8UfL2A==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.45", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^8.0.3", + "browserslist": "^4.14.3", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.2.0", + "eslint-scope": "^5.1.0", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.1.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^4.2.0", + "schema-utils": "^3.0.0", + "tapable": "^2.0.0", + "terser-webpack-plugin": "^5.0.0", + "watchpack": "^2.0.0", + "webpack-sources": "^2.0.1" }, "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "minimist": "^1.2.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "p-locate": "^4.1.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "p-limit": "^2.2.0" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "find-up": "^4.0.0" } }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "supports-color": { + } + } + }, + "webpack-cli": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.1.0.tgz", + "integrity": "sha512-NdhxXMZmoik62Y05t0h1y65LjBM7BwFPq311ihXuMM3RY6dlc4KkCTyHLzTuBEc+bqq6d3xh+CWmU0xRexNJBA==", + "dev": true, + "requires": { + "@webpack-cli/info": "^1.0.2", + "@webpack-cli/serve": "^1.0.1", + "ansi-escapes": "^4.3.1", + "colorette": "^1.2.1", + "command-line-usage": "^6.1.0", + "commander": "^6.0.0", + "enquirer": "^2.3.4", + "execa": "^4.0.0", + "import-local": "^3.0.2", + "interpret": "^2.0.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.1.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "commander": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", + "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "dev": true } } }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", + "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" }, "dependencies": { "source-map": { @@ -6308,64 +4575,28 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "wordwrapjs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", + "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "reduce-flatten": "^2.0.0", + "typical": "^5.0.0" } }, "wrappy": { @@ -6374,97 +4605,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } } diff --git a/package.json b/package.json index 83ef99f21..fcc9a245f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "_app/main.js", "scripts": { "start": "npm run dev", - "jekyll": "bundle exec jekyll serve --incremental", + "jekyll": "bundle exec jekyll serve --incremental --livereload", "dev-webpack": "webpack --mode development --watch", "webpack": "webpack --mode production", "dev": "npm run dev-webpack & npm run jekyll", @@ -24,17 +24,18 @@ }, "homepage": "https://github.com/ParsePlatform/docs#readme", "devDependencies": { - "babel-core": "^6.26.3", - "babel-loader": "~7.1.4", - "babel-preset-es2015": "^6.24.1", - "babel-preset-react": "^6.5.0", - "husky": "^1.0.0-rc.13", - "webpack": "^4.41.5", - "webpack-cli": "^3.3.10" + "@babel/core": "7.12.3", + "@babel/preset-env": "7.12.1", + "babel-loader": "8.1.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-react": "6.24.1", + "husky": "4.3.0", + "webpack": "5.1.3", + "webpack-cli": "4.1.0" }, "dependencies": { - "jquery": "3.5.0", - "underscore": "^1.8.3" + "jquery": "3.5.1", + "underscore": "1.12.1" }, "husky": { "hooks": { diff --git a/parse-server.md b/parse-server.md index 3976a152c..7c1a89ef2 100644 --- a/parse-server.md +++ b/parse-server.md @@ -20,8 +20,7 @@ sections: - "parse-server/cache-adapters.md" - "parse-server/live-query.md" - "parse-server/third-party-auth.md" -- "parse-server/compatibility.md" -- "parse-server/MongoRocks.md" -- "parse-server/MongoReadPreference.md" +- "parse-server/mongo-read-preference.md" - "parse-server/development.md" +- "parse-server/best-practice.md" --- diff --git a/webpack.config.js b/webpack.config.js index 82765ed71..320c68b20 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,8 +14,8 @@ module.exports = { exclude: /node_modules/, use: { loader: 'babel-loader', - query: { - presets: ['es2015', 'react'] + options: { + presets: ['@babel/preset-env'] } }, },