diff --git a/.eslintrc.json b/.eslintrc.json index 28cc85f416..e1cc3e6a2d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,26 +1,25 @@ { - "env": { - "es6": true, - "node": true, - "browser": true + "env": { + "es6": true, + "node": true, + "browser": true + }, + "parser": "babel-eslint", + "extends": "eslint:recommended", + "parserOptions": { + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": true }, - "parser": "babel-eslint", - "extends": "eslint:recommended", - "parserOptions": { - "ecmaFeatures": { - "experimentalObjectRestSpread": true, - "jsx": true - }, - "sourceType": "module" - }, - "plugins": [ - "react" - ], - "rules": { - "react/jsx-uses-vars": 1, - "react/jsx-uses-react": 1, - "react/react-in-jsx-scope": 1, - "no-console": 0, - "no-case-declarations": 0 - } + "sourceType": "module" + }, + "plugins": ["react"], + "rules": { + "react/jsx-uses-vars": 1, + "react/jsx-uses-react": 1, + "react/react-in-jsx-scope": 1, + "no-console": 0, + "no-case-declarations": 0, + "quotes": ["error", "single"] + } } diff --git a/CHANGELOG.md b/CHANGELOG.md index b0378c252f..992fa1e748 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ ### master [Full Changelog](https://github.com/parse-community/parse-dashboard/compare/2.0.4...master) -* _Contributing to this repo? Add info about your change here to be included in next release_ +* Feature: added JS Console feature to run custom queries +* Feature: added save button on JS Console feature to save the custom query on the local storage ### 2.0.5 [Full Changelog](https://github.com/parse-community/parse-dashboard/compare/2.0.4...2.0.5) * Fix: delete and regenerate package-lock to fix broken build diff --git a/Parse-Dashboard/Authentication.js b/Parse-Dashboard/Authentication.js index 8dd49a2a6d..ef6bf88bae 100644 --- a/Parse-Dashboard/Authentication.js +++ b/Parse-Dashboard/Authentication.js @@ -1,4 +1,4 @@ -"use strict"; +'use strict'; var bcrypt = require('bcryptjs'); var csrf = require('csurf'); var passport = require('passport'); diff --git a/Parse-Dashboard/app.js b/Parse-Dashboard/app.js index 52e747a368..2a793e5610 100644 --- a/Parse-Dashboard/app.js +++ b/Parse-Dashboard/app.js @@ -29,12 +29,12 @@ function checkIfIconsExistForApps(apps, iconsFolder) { for (var i in apps) { var currentApp = apps[i]; var iconName = currentApp.iconName; - var path = iconsFolder + "/" + iconName; + var path = iconsFolder + '/' + iconName; fs.stat(path, function(err) { if (err) { if ('ENOENT' == err.code) {// file does not exist - console.warn("Icon with file name: " + iconName +" couldn't be found in icons folder!"); + console.warn('Icon with file name: ' + iconName +' couldn\'t be found in icons folder!'); } else { console.log( 'An error occurd while checking for icons, please check permission!'); @@ -162,8 +162,8 @@ module.exports = function(config, options) { } } catch (e) { // Directory doesn't exist or something. - console.warn("Iconsfolder at path: " + config.iconsFolder + - " not found!"); + console.warn('Iconsfolder at path: ' + config.iconsFolder + + ' not found!'); } } diff --git a/Parse-Dashboard/index.js b/Parse-Dashboard/index.js index 953ae31cba..42484d5fce 100644 --- a/Parse-Dashboard/index.js +++ b/Parse-Dashboard/index.js @@ -6,7 +6,7 @@ * the root directory of this source tree. */ // Command line tool for npm start -"use strict" +'use strict' const path = require('path'); const jsonFile = require('json-file-plus'); const express = require('express'); @@ -40,7 +40,7 @@ const trustProxy = program.trustProxy || process.env.PARSE_DASHBOARD_TRUST_PROXY const dev = program.dev; if (trustProxy && allowInsecureHTTP) { - console.log("Set only trustProxy *or* allowInsecureHTTP, not both. Only one is needed to handle being behind a proxy."); + console.log('Set only trustProxy *or* allowInsecureHTTP, not both. Only one is needed to handle being behind a proxy.'); process.exit(-1); } diff --git a/Parse-Dashboard/parse-dashboard-config.json b/Parse-Dashboard/parse-dashboard-config.json index c252aebd73..e5c4decbf3 100644 --- a/Parse-Dashboard/parse-dashboard-config.json +++ b/Parse-Dashboard/parse-dashboard-config.json @@ -1,12 +1,14 @@ { - "apps": [{ - "serverURL": "http://localhost:1338/parse", - "appId": "hello", - "masterKey": "world", - "appName": "", - "iconName": "", - "primaryBackgroundColor": "", - "secondaryBackgroundColor": "" - }], + "apps": [ + { + "serverURL": "http://localhost:1338/parse", + "appId": "hello", + "masterKey": "world", + "appName": "", + "iconName": "", + "primaryBackgroundColor": "", + "secondaryBackgroundColor": "" + } + ], "iconsFolder": "icons" } diff --git a/package-lock.json b/package-lock.json index a9991f941a..685884902f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,13 +26,22 @@ }, "dependencies": { "@types/node": { - "version": "10.17.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", - "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==", + "version": "10.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.15.tgz", + "integrity": "sha512-daFGV9GSs6USfPgxceDA8nlSe48XrVCJfDeYm7eokxq/ye7iuOH87hKXgMtEAVLFapkczbZsx868PMDT1Y0a6A==", "dev": true } } }, + "@apollographql/apollo-tools": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.3.tgz", + "integrity": "sha512-CtC1bmohB1owdGMT2ZZKacI94LcPAZDN2WvCe+4ZXT5d7xO5PHOAb70EP/LcFbvnS8QI+pkYRSCGFQnUcv9efg==", + "dev": true, + "requires": { + "apollo-env": "^0.6.1" + } + }, "@apollographql/graphql-playground-html": { "version": "1.6.24", "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz", @@ -3520,9 +3529,9 @@ } }, "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", "dev": true, "requires": { "@types/node": "*" @@ -3550,9 +3559,9 @@ } }, "@types/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", - "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", + "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", "dev": true, "requires": { "@types/body-parser": "*", @@ -3561,9 +3570,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.16.10", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.10.tgz", - "integrity": "sha512-gM6evDj0OvTILTRKilh9T5dTaGpv1oYiFcJAfgSejuMJgGJUsD9hKEU2lB4aiTNy4WwChxRnjfYFuBQsULzsJw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", + "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", "dev": true, "requires": { "@types/node": "*", @@ -3638,15 +3647,15 @@ "dev": true }, "@types/keygrip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.1.tgz", - "integrity": "sha1-/1QEYtL7TQqIRBzq8n0oewHD2Hg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", "dev": true }, "@types/koa": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.0.51.tgz", - "integrity": "sha512-L5e/l6Z+SR9Jk6HM0wNYdkvWhSUBOvi+7Q5Uwn7kE/VmBXX7NIxARMigARWAyXAtXiv5Ry1P2HmebolFdvuIVg==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.1.tgz", + "integrity": "sha512-/kqQs+8Qd9GL0cdl39HEhK91k7xq6+Zci76RUdqtTLj1Mg1aVG7zwJm3snkeyFUeAvY8noY27eMXgqg1wHZgwA==", "dev": true, "requires": { "@types/accepts": "*", @@ -3658,18 +3667,18 @@ } }, "@types/koa-compose": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.4.tgz", - "integrity": "sha512-ioou0rxkuWL+yBQYsHUQAzRTfVxAg8Y2VfMftU+Y3RA03/MzuFL0x/M2sXXj3PkfnENbHsjeHR1aMdezLYpTeA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", + "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", "dev": true, "requires": { "@types/koa": "*" } }, "@types/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", - "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", "dev": true }, "@types/lru-cache": { @@ -3690,9 +3699,9 @@ "dev": true }, "@types/node": { - "version": "12.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", - "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==", + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.2.tgz", + "integrity": "sha512-uvilvAQbdJvnSBFcKJ2td4016urcGvsiR+N4dHGU87ml8O2Vl6l+ErOi9w0kXSPiwJ1AYlIW+0pDXDWWMOiWbw==", "dev": true }, "@types/node-fetch": { @@ -3716,24 +3725,14 @@ "dev": true }, "@types/react": { - "version": "16.9.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.15.tgz", - "integrity": "sha512-WsmM1b6xQn1tG3X2Hx4F3bZwc2E82pJXt5OPs2YJgg71IzvUoKOSSSYOvLXYCg1ttipM+UuA4Lj3sfvqjVxyZw==", + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" } }, - "@types/readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-Mq2eLkGYamlcolW603FY2ROBvcl90jPF+3jLkjpBV6qS+2aVeJqlgRG0TVAa1oWbmPdb5yOWlOPVvQle76nUNw==", - "dev": true, - "requires": { - "@types/node": "*", - "safe-buffer": "*" - } - }, "@types/serve-static": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", @@ -3751,9 +3750,9 @@ "dev": true }, "@types/ws": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.3.tgz", - "integrity": "sha512-yBTM0P05Tx9iXGq00BbJPo37ox68R5vaGTXivs6RGh/BQ6QP5zqZDGWdAO6JbRE/iR1l80xeGAwCQS2nMV9S/w==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", + "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", "dev": true, "requires": { "@types/node": "*" @@ -4053,6 +4052,11 @@ "negotiator": "0.6.2" } }, + "ace-builds": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.8.tgz", + "integrity": "sha512-8ZVAxwyCGAxQX8mOp9imSXH0hoSPkGfy8igJy+WO/7axL30saRhKgg1XPACSmxxPA7nfHVwM+ShWXT+vKsNuFg==" + }, "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", @@ -4168,6 +4172,81 @@ } } }, + "apollo-cache-control": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.11.tgz", + "integrity": "sha512-8yz4qbRBIFDWRHdT8uPh0HHh+VbQXxoFGJQRAG8hyMRvR+EuURXX1ltXYkn5J3YJ3MKEqgsvwGaq60dFZq63UQ==", + "dev": true, + "requires": { + "apollo-server-env": "^2.4.3", + "graphql-extensions": "^0.10.10" + } + }, + "apollo-datasource": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.0.tgz", + "integrity": "sha512-Yja12BgNQhzuFGG/5Nw2MQe0hkuQy2+9er09HxeEyAf2rUDIPnhPrn1MDoZTB8MU7UGfjwITC+1ofzKkkrZobA==", + "dev": true, + "requires": { + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3" + } + }, + "apollo-engine-reporting": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.6.0.tgz", + "integrity": "sha512-prA17Tp/WYBJdCd4ey1CnGX8d4Xis1n9PsFmT7x8PV/oNpxG21/x3yNw5kPBZuKAoKz8yEggYtHhkYie1ZBjPQ==", + "dev": true, + "requires": { + "apollo-engine-reporting-protobuf": "^0.4.4", + "apollo-graphql": "^0.4.0", + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3", + "apollo-server-errors": "^2.3.4", + "apollo-server-types": "^0.2.10", + "async-retry": "^1.2.1", + "graphql-extensions": "^0.10.10" + } + }, + "apollo-engine-reporting-protobuf": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.4.tgz", + "integrity": "sha512-SGrIkUR7Q/VjU8YG98xcvo340C4DaNUhg/TXOtGsMlfiJDzHwVau/Bv6zifAzBafp2lj0XND6Daj5kyT/eSI/w==", + "dev": true, + "requires": { + "@apollo/protobufjs": "^1.0.3" + } + }, + "apollo-env": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.1.tgz", + "integrity": "sha512-B9BgpQGR1ndeDtb4Gtor0J4CITQ+OPACZrVW6lgStnljKEe9ZB76DZ1dAd3OCeizAswW6Lo9uvfK8jhVS5nBhQ==", + "dev": true, + "requires": { + "@types/node-fetch": "2.5.4", + "core-js": "^3.0.1", + "node-fetch": "^2.2.0", + "sha.js": "^2.4.11" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + } + } + }, + "apollo-graphql": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.4.0.tgz", + "integrity": "sha512-abCHcKln1EGbzSItW087EjBI5wnluikyUqEn4VsdeWHCtdENWpHCn/MnM0+jJa1prNasxN7tCukp4nMpJYYVqg==", + "dev": true, + "requires": { + "apollo-env": "^0.6.1", + "lodash.sortby": "^4.7.0" + } + }, "apollo-link": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz", @@ -4207,6 +4286,103 @@ "apollo-link": "^1.2.2" } }, + "apollo-server-caching": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz", + "integrity": "sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw==", + "dev": true, + "requires": { + "lru-cache": "^5.0.0" + }, + "dependencies": { + "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 + } + } + }, + "apollo-server-core": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.10.1.tgz", + "integrity": "sha512-BVITSJRMnj+CWFkjt7FMcaoqg/Ni9gfyVE9iu8bUc1IebBfFDcQj652Iolr7dTqyUziN2jbf0wfcybKYJLQHQQ==", + "dev": true, + "requires": { + "@apollographql/apollo-tools": "^0.4.3", + "@apollographql/graphql-playground-html": "1.6.24", + "@types/graphql-upload": "^8.0.0", + "@types/ws": "^6.0.0", + "apollo-cache-control": "^0.8.11", + "apollo-datasource": "^0.7.0", + "apollo-engine-reporting": "^1.6.0", + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3", + "apollo-server-errors": "^2.3.4", + "apollo-server-plugin-base": "^0.6.10", + "apollo-server-types": "^0.2.10", + "apollo-tracing": "^0.8.11", + "fast-json-stable-stringify": "^2.0.0", + "graphql-extensions": "^0.10.10", + "graphql-tag": "^2.9.2", + "graphql-tools": "^4.0.0", + "graphql-upload": "^8.0.2", + "sha.js": "^2.4.11", + "subscriptions-transport-ws": "^0.9.11", + "ws": "^6.0.0" + }, + "dependencies": { + "graphql-upload": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", + "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", + "dev": true, + "requires": { + "busboy": "^0.3.1", + "fs-capacitor": "^2.0.4", + "http-errors": "^1.7.3", + "object-path": "^0.11.4" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "apollo-server-env": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.3.tgz", @@ -4223,6 +4399,60 @@ "integrity": "sha512-Y0PKQvkrb2Kd18d1NPlHdSqmlr8TgqJ7JQcNIfhNDgdb45CnqZlxL1abuIRhr8tiw8OhVOcFxz2KyglBi8TKdA==", "dev": true }, + "apollo-server-express": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.10.1.tgz", + "integrity": "sha512-NkuWGBOCTiju/aDjfvDImm+4yzfrM0dwiRxu9fKwwh2h1oYBUKJNqjQ1mzJRi0ks6Sn1egwl/fQkTBTkWwGx7Q==", + "dev": true, + "requires": { + "@apollographql/graphql-playground-html": "1.6.24", + "@types/accepts": "^1.3.5", + "@types/body-parser": "1.17.1", + "@types/cors": "^2.8.4", + "@types/express": "4.17.2", + "accepts": "^1.3.5", + "apollo-server-core": "^2.10.1", + "apollo-server-types": "^0.2.10", + "body-parser": "^1.18.3", + "cors": "^2.8.4", + "express": "^4.17.1", + "graphql-subscriptions": "^1.0.0", + "graphql-tools": "^4.0.0", + "parseurl": "^1.3.2", + "subscriptions-transport-ws": "^0.9.16", + "type-is": "^1.6.16" + } + }, + "apollo-server-plugin-base": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.10.tgz", + "integrity": "sha512-/xT7UT/tbCDIoTQ4lcEQsJ0ACh7h7QG0BDmeSlDXjwDuENRI50bQ2QoluCMPitZXGe+FCQfLhvzFgzbsZGT0IA==", + "dev": true, + "requires": { + "apollo-server-types": "^0.2.10" + } + }, + "apollo-server-types": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.10.tgz", + "integrity": "sha512-ke9ViPEWfW+2XLe66CaKGVZdS7duSLbamSKSprmmeMBd8s6tmjf0FumUVxV7X4quxPZi0OPo8x0LoLU7GWsmaA==", + "dev": true, + "requires": { + "apollo-engine-reporting-protobuf": "^0.4.4", + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3" + } + }, + "apollo-tracing": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.11.tgz", + "integrity": "sha512-Z0wDZ5QOBmpGoajB74ZKGTM7GzG6rqZRzAph4kxud6axcyNqUDKiKZ3Eere+NSLwvvt8M3qnPW4UJSUy/wwOXg==", + "dev": true, + "requires": { + "apollo-server-env": "^2.4.3", + "graphql-extensions": "^0.10.10" + } + }, "apollo-utilities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz", @@ -4362,9 +4592,9 @@ } }, "assert-options": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.6.0.tgz", - "integrity": "sha512-xmBFb5sY0AO8SNihIfavR6uMhOyzq6D7RoFKJxxAditMQc876szBBQ9RQVwLi6Bm3zUoG0nexZK11Gy5TBX69A==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.6.1.tgz", + "integrity": "sha512-jH2pNULN0t3uFLb7Fh0SAuMo/Ei5yWiRirvLez2g+sd16d0xKl+DGdGkD6sqkrZTnCZK5lWRjUa4X3sxHQkg9g==", "dev": true }, "assert-plus": { @@ -4418,9 +4648,9 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "async-retry": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", - "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", + "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", "dev": true, "requires": { "retry": "0.12.0" @@ -4666,6 +4896,11 @@ } } }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -4678,6 +4913,17 @@ "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=", "dev": true }, + "bcrypt": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.8.tgz", + "integrity": "sha512-jKV6RvLhI36TQnPDvUFqBEnGX9c8dRRygKxCZu7E+MgLfKZbmmXL8a7/SFFOyHoPNX9nV81cKRC5tbQfvEQtpw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.14.0" + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -4714,6 +4960,16 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -4931,9 +5187,9 @@ } }, "bson": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", - "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", + "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==", "dev": true }, "buffer": { @@ -5672,24 +5928,95 @@ "dev": true }, "coveralls": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.7.tgz", - "integrity": "sha512-mUuH2MFOYB2oBaA4D4Ykqi9LaEYpMMlsiOMJOrv358yAjP6enPIk55fod2fNJ8AvwoYXStWQls37rA+s5e7boA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.9.tgz", + "integrity": "sha512-nNBg3B1+4iDox5A5zqHKzUTiwl2ey4k2o0NEcVZYvl+GOSJdKBj4AJGKLv6h3SvWch7tABHePAQOSZWM9E2hMg==", "dev": true, "requires": { - "growl": "~> 1.10.0", "js-yaml": "^3.13.1", - "lcov-parse": "^0.0.10", + "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", "minimist": "^1.2.0", - "request": "^2.86.0" + "request": "^2.88.0" }, "dependencies": { + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } } } }, @@ -5886,9 +6213,9 @@ } }, "csstype": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.7.tgz", - "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==" + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" }, "csurf": { "version": "1.11.0", @@ -5946,12 +6273,6 @@ "array-find-index": "^1.0.1" } }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -6142,6 +6463,12 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -6207,6 +6534,11 @@ "streamsearch": "0.1.2" } }, + "diff-match-patch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", + "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" + }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", @@ -6235,9 +6567,9 @@ }, "dependencies": { "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -6277,12 +6609,6 @@ "webidl-conversions": "^4.0.2" } }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", - "dev": true - }, "dtrace-provider": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", @@ -6479,9 +6805,9 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", "dev": true }, "errno": { @@ -7231,6 +7557,14 @@ "bser": "^2.0.0" } }, + "fbemitter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", + "requires": { + "fbjs": "^0.8.4" + } + }, "fbjs": { "version": "0.8.17", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", @@ -7302,9 +7636,9 @@ } }, "file-stream-rotator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", - "integrity": "sha512-W3aa3QJEc8BS2MmdVpQiYLKHj3ijpto1gMDlsgCRSKfIUe6MwkcpODGPQ3vZfb0XvCeCqlu9CBQTN7oQri2TZQ==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz", + "integrity": "sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ==", "dev": true, "requires": { "moment": "^2.11.2" @@ -7417,6 +7751,15 @@ "readable-stream": "^2.3.6" } }, + "flux": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", + "integrity": "sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io=", + "requires": { + "fbemitter": "^2.0.0", + "fbjs": "^0.8.0" + } + }, "follow-redirects": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", @@ -8329,9 +8672,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz", + "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==", "dev": true, "requires": { "glob": "~7.1.1", @@ -8378,11 +8721,36 @@ "integrity": "sha512-+r8qY2JRRs+uaZcrZOxpNhdlCZoS8yS5KQ6X53Twc8WecZ6VtAn+MVHroLOd4u9HVPxTXZ9RUd9+556EpTc0xA==", "requires": { "codemirror": "^5.26.0", + "codemirror-graphql": "^0.6.11", "markdown-it": "^8.4.0" - } - }, - "graphql": { - "version": "14.6.0", + }, + "dependencies": { + "codemirror-graphql": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.6.12.tgz", + "integrity": "sha512-7YP956JubbWkmk9QqKy62CZgdGbEulHNJkz2/aUDTpsE1KrQtRrT9WzStJaxAOEX2k4wUOpojUX2ItPxa69kFA==", + "requires": { + "graphql-language-service-interface": "^1.0.16", + "graphql-language-service-parser": "^0.1.14" + } + }, + "graphql-language-service-parser": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-0.1.14.tgz", + "integrity": "sha512-72M4OksONeqT5slfdfODmlPBFlUQQkcnRhjgmPt9H2n8/DUcf4XzDkGXudBWpzNfjVU35+IADYW6x13wKw/fOg==", + "requires": { + "graphql-language-service-types": "^0.1.14" + } + }, + "graphql-language-service-types": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-0.1.14.tgz", + "integrity": "sha512-77KP83gvK0gWswvGY/+jx/GpsOfKuwWQ1AYnyPT2GDGG3//1QxQTObaZMAEevNTxJtO8T26YXxoUlqkvET7iEg==" + } + } + }, + "graphql": { + "version": "14.6.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz", "integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==", "requires": { @@ -8401,6 +8769,17 @@ "minimatch": "^3.0.4" } }, + "graphql-extensions": { + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.10.tgz", + "integrity": "sha512-pNb1DmUk6vsGtCjCRecpKoXadKNMyKxyLyE9IX65N9aKSmLL+AF7dJOOc4MWhdaAXlzxaDDhe54GpaOfoH7AOw==", + "dev": true, + "requires": { + "@apollographql/apollo-tools": "^0.4.3", + "apollo-server-env": "^2.4.3", + "apollo-server-types": "^0.2.10" + } + }, "graphql-import": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.4.5.tgz", @@ -8421,12 +8800,12 @@ } }, "graphql-language-service-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.5.0.tgz", - "integrity": "sha512-DX3B6DfvKa28gJoywtnkkIUdZitWqKqBTrZ6CQV8V5wO3GzJalQKT0J+B56oDkS6MhjLt928Yu8fj63laNWfoA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.5.2.tgz", + "integrity": "sha512-kModfvwX5XiT+tYRhh8d6X+rb5Zq9zFQVdcoVlQJvoIW7U6SkxUAeO5Ei9OI3KOMH5r8wyfmXflBZ+xUbJySJw==", "requires": { "graphql-config": "2.2.1", - "graphql-language-service-types": "^1.5.0" + "graphql-language-service-types": "^1.5.2" }, "dependencies": { "graphql-config": { @@ -8453,9 +8832,9 @@ } }, "graphql-language-service-types": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.5.0.tgz", - "integrity": "sha512-THxB15oPC56zlNVSwv7JCahuSUbI9xnUHdftjOqZOz5588qjlPw/UHWQ8V/k0/XwZvH/TwCkmnBkIRmPVb1S5Q==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.5.2.tgz", + "integrity": "sha512-WOFHBZX1K41svohPTmhOcKg+zz27d6ULFuZ8mzkiJ9nIpGKueAPyh7/xR0VZNBUAfDzTCbE6wQZxsPl5Kvd7IA==", "requires": { "graphql-config": "2.2.1" }, @@ -8536,6 +8915,7 @@ "react-helmet": "^5.2.0", "react-input-autosize": "^2.2.1", "react-modal": "^3.1.11", + "react-redux": "^5.0.6", "react-router-dom": "^4.2.2", "react-sortable-hoc": "^0.8.3", "react-transition-group": "^2.2.1", @@ -8597,6 +8977,30 @@ "strict-uri-encode": "^1.0.0" } }, + "react-redux": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.2.tgz", + "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==", + "requires": { + "@babel/runtime": "^7.1.2", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.1", + "react-is": "^16.6.0", + "react-lifecycles-compat": "^3.0.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + } + } + }, "react-router": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", @@ -8653,9 +9057,9 @@ } }, "graphql-tag": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", - "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.3.tgz", + "integrity": "sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==", "dev": true }, "graphql-tools": { @@ -8671,11 +9075,51 @@ "uuid": "^3.1.0" } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true + "graphql-upload": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-10.0.0.tgz", + "integrity": "sha512-8n11qujsqHWT48visvQbqLqAj8o6NCLJ35tGkI/RynhDs7E07TxlswVe4vPZaLiXJeemZA7xrxkMohwP//DOqA==", + "dev": true, + "requires": { + "busboy": "^0.3.1", + "fs-capacitor": "^6.1.0", + "http-errors": "^1.7.3", + "isobject": "^4.0.0", + "object-path": "^0.11.4" + }, + "dependencies": { + "fs-capacitor": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-6.1.0.tgz", + "integrity": "sha512-YsKGCLAB40P3OKeciIa7cKzt7WkY8QT9ETa2wVIG3fQDHW2h3xtRo0770lUIbPrjCr5Sa+zFhixNJ+2xNxaraQ==", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true + } + } }, "growly": { "version": "1.3.0", @@ -8698,9 +9142,9 @@ } }, "handlebars": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.5.tgz", - "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -8987,9 +9431,9 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.3.tgz", - "integrity": "sha512-Ytgnz23gm2DVftnzqRRz2dOXZbGd2uiajSw/95bPp6v53zPRspQjLm/AfBgqbJ2qfeRXWIOMVLpp86+/5yX39Q==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { "agent-base": "^4.3.0", @@ -9373,13 +9817,10 @@ "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" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -10354,9 +10795,9 @@ } }, "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, "ldap-filter": { @@ -10517,11 +10958,26 @@ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -10594,12 +11050,6 @@ "triple-beam": "^1.3.0" }, "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10713,12 +11163,6 @@ "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", "dev": true }, - "manakin": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/manakin/-/manakin-0.5.2.tgz", - "integrity": "sha512-pfDSB7QYoVg0Io4KMV9hhPoXpj6p0uBscgtyUSKCOFZe8bqgbpStfgnKIbF/ulnr6U3ICu4OqdyxAqBgOhZwBQ==", - "dev": true - }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -11152,6 +11596,28 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", "dev": true }, + "mongodb": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.3.tgz", + "integrity": "sha512-II7P7A3XUdPiXRgcN96qIoRa1oesM6qLNZkzfPluNZjVkgQk3jnQwOT6/uDk4USRDTTLjNFw2vwfmbRGTA7msg==", + "dev": true, + "requires": { + "bl": "^2.2.0", + "bson": "^1.1.1", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -11254,9 +11720,9 @@ "optional": true }, "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.2.tgz", + "integrity": "sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==", "dev": true, "optional": true, "requires": { @@ -11474,6 +11940,64 @@ } } }, + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "optional": true + } + } + }, "node-releases": { "version": "1.1.47", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", @@ -11492,9 +12016,9 @@ } }, "node-sass": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", - "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -11699,21 +12223,32 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" }, "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", - "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-run-path": { @@ -11823,9 +12358,9 @@ } }, "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", "dev": true }, "object-inspect": { @@ -12213,6 +12748,7 @@ "resolved": "https://registry.npmjs.org/parse/-/parse-2.11.0.tgz", "integrity": "sha512-dbGdA5M1ylky4T/b5pOXeYhsHwzATz/JbweCiBtdJLsnb8SylSSgA7V0U96RtXBI1Hfzp5uFZpqmnUKr5t69NA==", "requires": { + "@babel/runtime": "7.7.7", "@babel/runtime-corejs3": "7.7.7", "crypto-js": "3.1.9-1", "uuid": "3.3.3", @@ -12221,9 +12757,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", - "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", + "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -12266,7 +12802,7 @@ "dev": true }, "parse-server": { - "version": "github:parseplatform/parse-server#f67f8dbe705e69b457b5e90cc9208840f4841284", + "version": "github:parseplatform/parse-server#3c46117d9b17aadefc8d4770ac3ff626eb333ccb", "from": "github:parseplatform/parse-server#master", "dev": true, "requires": { @@ -12275,48 +12811,41 @@ "@parse/push-adapter": "3.2.0", "@parse/s3-files-adapter": "1.4.0", "@parse/simple-mailgun-adapter": "1.1.0", - "apollo-server-express": "2.9.13", - "bcrypt": "3.0.7", + "apollo-server-express": "2.10.1", + "bcrypt": "3.0.8", "bcryptjs": "2.4.3", "body-parser": "1.19.0", + "commander": "4.1.1", "cors": "2.8.5", "deepcopy": "2.0.0", "express": "4.17.1", - "follow-redirects": "1.9.0", + "follow-redirects": "1.9.1", + "graphql": "14.6.0", "graphql-list-fields": "2.0.2", "graphql-relay": "^0.6.0", "graphql-tools": "^4.0.5", - "graphql-upload": "9.0.0", + "graphql-upload": "10.0.0", "intersect": "1.0.1", "jsonwebtoken": "8.5.1", "ldapjs": "1.0.2", "lodash": "4.17.15", "lru-cache": "5.1.1", "mime": "2.4.4", - "mongodb": "3.4.0", + "mongodb": "3.5.3", "node-rsa": "1.0.7", - "parse": "2.10.0", - "pg-promise": "10.3.1", + "parse": "2.11.0", + "pg-promise": "10.4.3", "pluralize": "^8.0.0", - "redis": "2.8.0", - "semver": "7.1.0", + "redis": "3.0.0", + "semver": "7.1.3", "subscriptions-transport-ws": "0.9.16", "tv4": "1.3.0", "uuid": "3.3.3", "winston": "3.2.1", - "winston-daily-rotate-file": "3.10.0", + "winston-daily-rotate-file": "4.4.0", "ws": "7.2.1" }, "dependencies": { - "@apollographql/apollo-tools": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.3.tgz", - "integrity": "sha512-CtC1bmohB1owdGMT2ZZKacI94LcPAZDN2WvCe+4ZXT5d7xO5PHOAb70EP/LcFbvnS8QI+pkYRSCGFQnUcv9efg==", - "dev": true, - "requires": { - "apollo-env": "^0.6.1" - } - }, "@babel/runtime": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", @@ -12380,190 +12909,51 @@ "requires": { "aws-sdk": "2.59.0", "parse": "2.10.0" - } - }, - "apollo-cache-control": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.11.tgz", - "integrity": "sha512-8yz4qbRBIFDWRHdT8uPh0HHh+VbQXxoFGJQRAG8hyMRvR+EuURXX1ltXYkn5J3YJ3MKEqgsvwGaq60dFZq63UQ==", - "dev": true, - "requires": { - "apollo-server-env": "^2.4.3", - "graphql-extensions": "^0.10.10" - } - }, - "apollo-datasource": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.6.4.tgz", - "integrity": "sha512-u4eu6Q94q6KuZacZfdo4vCevA81F4QWeTYEXUvoksQMJpiacPHHe0DJrofKVKvxngUp5kCi1RnPXSc6kBY+/oA==", - "dev": true, - "requires": { - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.3" - } - }, - "apollo-engine-reporting": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.4.14.tgz", - "integrity": "sha512-cCG9qDOPwbh87ZjQGHgmnP3oPqhqjIZcNmm/lNtWkWXGTlxV/jmUEqpVi+wsDbE5gR7d1OFk6GqSy2ZQh+S+Bw==", - "dev": true, - "requires": { - "apollo-engine-reporting-protobuf": "^0.4.4", - "apollo-graphql": "^0.3.7", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.3", - "apollo-server-errors": "^2.3.4", - "apollo-server-types": "^0.2.10", - "async-retry": "^1.2.1", - "graphql-extensions": "^0.10.10" - } - }, - "apollo-engine-reporting-protobuf": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.4.tgz", - "integrity": "sha512-SGrIkUR7Q/VjU8YG98xcvo340C4DaNUhg/TXOtGsMlfiJDzHwVau/Bv6zifAzBafp2lj0XND6Daj5kyT/eSI/w==", - "dev": true, - "requires": { - "@apollo/protobufjs": "^1.0.3" - } - }, - "apollo-env": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.1.tgz", - "integrity": "sha512-B9BgpQGR1ndeDtb4Gtor0J4CITQ+OPACZrVW6lgStnljKEe9ZB76DZ1dAd3OCeizAswW6Lo9uvfK8jhVS5nBhQ==", - "dev": true, - "requires": { - "@types/node-fetch": "2.5.4", - "core-js": "^3.0.1", - "node-fetch": "^2.2.0", - "sha.js": "^2.4.11" - } - }, - "apollo-graphql": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.3.7.tgz", - "integrity": "sha512-ghW16xx9tRcyL38Pw6G5OidMnYn+CNUGZWmvqQgEO2nRy4T0ONPZZBOvGrIMtJQ70oEykNMKGm0zm6PdHdxd8Q==", - "dev": true, - "requires": { - "apollo-env": "^0.6.1", - "lodash.sortby": "^4.7.0" - } - }, - "apollo-server-caching": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz", - "integrity": "sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw==", - "dev": true, - "requires": { - "lru-cache": "^5.0.0" - } - }, - "apollo-server-core": { - "version": "2.9.16", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.9.16.tgz", - "integrity": "sha512-4ftdjSfs/3aEare9QNTVSF0yUvXETxiohuDLZ7gmMIQxNnZhUjVXiZL1rYKuIZ12uH7xLvh/DwkXRt6nLG/lZA==", - "dev": true, - "requires": { - "@apollographql/apollo-tools": "^0.4.3", - "@apollographql/graphql-playground-html": "1.6.24", - "@types/graphql-upload": "^8.0.0", - "@types/ws": "^6.0.0", - "apollo-cache-control": "^0.8.11", - "apollo-datasource": "^0.6.4", - "apollo-engine-reporting": "^1.4.14", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.3", - "apollo-server-errors": "^2.3.4", - "apollo-server-plugin-base": "^0.6.10", - "apollo-server-types": "^0.2.10", - "apollo-tracing": "^0.8.11", - "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.10.10", - "graphql-tag": "^2.9.2", - "graphql-tools": "^4.0.0", - "graphql-upload": "^8.0.2", - "sha.js": "^2.4.11", - "subscriptions-transport-ws": "^0.9.11", - "ws": "^6.0.0" }, "dependencies": { - "graphql-upload": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", - "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", + "@babel/runtime": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", + "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.4.tgz", + "integrity": "sha512-BBIEhzk8McXDcB3IbOi8zQPzzINUp4zcLesVlBSOcyGhzPUU8Xezk5GAG7Sy5GVhGmAO0zGd2qRSeY2g4Obqxw==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.2" + } + }, + "parse": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-2.10.0.tgz", + "integrity": "sha512-TBJCvQPachrcGGLbN8llN8tOr01VsKB6pxi3OWq3/C0bIHHdb2Bd+cgH4v5ZlRCrZt3MHVasGH4rvx7Klkp7Wg==", "dev": true, "requires": { - "busboy": "^0.3.1", - "fs-capacitor": "^2.0.4", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" + "@babel/runtime": "7.7.4", + "@babel/runtime-corejs3": "7.7.4", + "uuid": "3.3.3", + "ws": "7.2.0", + "xmlhttprequest": "1.8.0" } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", + "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "^1.0.0" } } } }, - "apollo-server-express": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.9.13.tgz", - "integrity": "sha512-M306e07dpZ8YpZx4VBYa0FWlt+wopj4Bwn0Iy1iJ6VjaRyGx2HCUJvLpHZ+D0TIXtQ2nX3DTYeOouVaDDwJeqQ==", - "dev": true, - "requires": { - "@apollographql/graphql-playground-html": "1.6.24", - "@types/accepts": "^1.3.5", - "@types/body-parser": "1.17.1", - "@types/cors": "^2.8.4", - "@types/express": "4.17.1", - "accepts": "^1.3.5", - "apollo-server-core": "^2.9.13", - "apollo-server-types": "^0.2.8", - "body-parser": "^1.18.3", - "cors": "^2.8.4", - "express": "^4.17.1", - "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.0", - "parseurl": "^1.3.2", - "subscriptions-transport-ws": "^0.9.16", - "type-is": "^1.6.16" - } - }, - "apollo-server-plugin-base": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.10.tgz", - "integrity": "sha512-/xT7UT/tbCDIoTQ4lcEQsJ0ACh7h7QG0BDmeSlDXjwDuENRI50bQ2QoluCMPitZXGe+FCQfLhvzFgzbsZGT0IA==", - "dev": true, - "requires": { - "apollo-server-types": "^0.2.10" - } - }, - "apollo-server-types": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.10.tgz", - "integrity": "sha512-ke9ViPEWfW+2XLe66CaKGVZdS7duSLbamSKSprmmeMBd8s6tmjf0FumUVxV7X4quxPZi0OPo8x0LoLU7GWsmaA==", - "dev": true, - "requires": { - "apollo-engine-reporting-protobuf": "^0.4.4", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.3" - } - }, - "apollo-tracing": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.11.tgz", - "integrity": "sha512-Z0wDZ5QOBmpGoajB74ZKGTM7GzG6rqZRzAph4kxud6axcyNqUDKiKZ3Eere+NSLwvvt8M3qnPW4UJSUy/wwOXg==", - "dev": true, - "requires": { - "apollo-server-env": "^2.4.3", - "graphql-extensions": "^0.10.10" - } - }, "aws-sdk": { "version": "2.59.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.59.0.tgz", @@ -12589,17 +12979,6 @@ } } }, - "bcrypt": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.7.tgz", - "integrity": "sha512-K5UglF9VQvBMHl/1elNyyFvAfOY9Bj+rpKrCSR9sFwcW8FywAYJSRwTURNej5TaAK2TEJkcJ6r6lh1YPmspx5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.13.0" - } - }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -12622,60 +13001,31 @@ "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=", "dev": true }, - "graphql-extensions": { - "version": "0.10.10", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.10.tgz", - "integrity": "sha512-pNb1DmUk6vsGtCjCRecpKoXadKNMyKxyLyE9IX65N9aKSmLL+AF7dJOOc4MWhdaAXlzxaDDhe54GpaOfoH7AOw==", - "dev": true, - "requires": { - "@apollographql/apollo-tools": "^0.4.3", - "apollo-server-env": "^2.4.3", - "apollo-server-types": "^0.2.10" - } - }, - "graphql-upload": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-9.0.0.tgz", - "integrity": "sha512-YR2o9GoDa5On3q3lYLkLo3gHfa8crCHvMY1QbT7Zqja6BUqiihqaGjbWbvSPko/gbDSmZE+zLcX46Ef+/SmRyA==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "busboy": "^0.3.1", - "fs-capacitor": "^4.0.1", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" + "ms": "^2.1.1" }, "dependencies": { "fs-capacitor": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-4.0.1.tgz", - "integrity": "sha512-e0qFoKQMFe52F54dMvZLD+I1M/Gs6xB2gnZVQB5FYT/8ioP6qTb3U/tzp55O0IuPOMvSM8j4ta0bVafIFjJzxQ==", - "dev": true, - "requires": { - "@types/readable-stream": "^2.3.5", - "readable-stream": "^3.4.0" - } + "integrity": "sha512-e0qFoKQMFe52F54dMvZLD+I1M/Gs6xB2gnZVQB5FYT/8ioP6qTb3U/tzp55O0IuPOMvSM8j4ta0bVafIFjJzxQ==" } } }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "follow-redirects": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.1.tgz", + "integrity": "sha512-oUNbrdUjHItyCytZQrHxWQ81ebL4xCFLH10sG0poUMgbKWoBnswpICjUBld3PLJ1lF6cCYVUBG7hAdLro0JNvg==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "debug": "^3.0.0" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12691,52 +13041,12 @@ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, - "mongodb": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.0.tgz", - "integrity": "sha512-W90jm/n8F0Edm47ljkVRK9l8qGW9g8T9ZSiZWRiUP58wLhsCJCeN/JxdpVnH0CUwwAw2hITUcCo9x58udpX2Uw==", - "dev": true, - "requires": { - "bson": "^1.1.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "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 }, - "node-pre-gyp": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", - "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", - "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - } - } - }, "node-rsa": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.0.7.tgz", @@ -12747,101 +13057,40 @@ } }, "parse": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/parse/-/parse-2.10.0.tgz", - "integrity": "sha512-TBJCvQPachrcGGLbN8llN8tOr01VsKB6pxi3OWq3/C0bIHHdb2Bd+cgH4v5ZlRCrZt3MHVasGH4rvx7Klkp7Wg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-2.11.0.tgz", + "integrity": "sha512-dbGdA5M1ylky4T/b5pOXeYhsHwzATz/JbweCiBtdJLsnb8SylSSgA7V0U96RtXBI1Hfzp5uFZpqmnUKr5t69NA==", "dev": true, "requires": { - "@babel/runtime": "7.7.4", - "@babel/runtime-corejs3": "7.7.4", + "@babel/runtime": "7.7.7", + "@babel/runtime-corejs3": "7.7.7", + "crypto-js": "3.1.9-1", "uuid": "3.3.3", - "ws": "7.2.0", + "ws": "7.2.1", "xmlhttprequest": "1.8.0" }, "dependencies": { "@babel/runtime": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", - "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", + "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/runtime-corejs3": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.4.tgz", - "integrity": "sha512-BBIEhzk8McXDcB3IbOi8zQPzzINUp4zcLesVlBSOcyGhzPUU8Xezk5GAG7Sy5GVhGmAO0zGd2qRSeY2g4Obqxw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.7.tgz", + "integrity": "sha512-kr3W3Fw8mB/CTru2M5zIRQZZgC/9zOxNSoJ/tVCzjPt3H1/p5uuGbz6WwmaQy/TLQcW31rUhUUWKY28sXFRelA==", "dev": true, "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.2" } - }, - "ws": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", - "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", - "dev": true, - "requires": { - "async-limiter": "^1.0.0" - } - } - } - }, - "pg": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.14.0.tgz", - "integrity": "sha512-TLsdOWKFu44vHdejml4Uoo8h0EwCjdIj9Z9kpz7pA5i8iQxOTwVb1+Fy+X86kW5AXKxQpYpYDs4j/qPDbro/lg==", - "dev": true, - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-pool": "^2.0.7", - "pg-types": "^2.1.0", - "pgpass": "1.x", - "semver": "4.3.2" - }, - "dependencies": { - "semver": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=", - "dev": true } } }, - "pg-promise": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.3.1.tgz", - "integrity": "sha512-1b9Nx1UMV0SE5zJC92ckM+DHFGB5koly/AILd5DpV0Zx4Z9/iytnbdUGz9qnnqKt+XIuXjdizT2FIyGyV2AxTQ==", - "dev": true, - "requires": { - "assert-options": "0.6.0", - "manakin": "0.5.2", - "pg": "7.14.0", - "pg-minify": "1.5.1", - "spex": "3.0.0" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -12849,27 +13098,11 @@ "dev": true }, "semver": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.0.tgz", - "integrity": "sha512-4P8Vc43MxQL6UKqSiEnf0jZNYx545R9W1HwXP6p65paPp86AUJiafZ8XG81hAbcldKMCUIbeykUTVYG19LB7Cw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "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" - } - }, "ws": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", @@ -13039,6 +13272,30 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "pg": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.18.1.tgz", + "integrity": "sha512-1KtKBKg/zWrjEEv//klBbVOPGucuc7HHeJf6OEMueVcUeyF3yueHf+DvhVwBjIAe9/97RAydO/lWjkcMwssuEw==", + "dev": true, + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "0.1.3", + "pg-packet-stream": "^1.1.0", + "pg-pool": "^2.0.10", + "pg-types": "^2.1.0", + "pgpass": "1.x", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=", + "dev": true + } + } + }, "pg-connection-string": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", @@ -13052,17 +13309,35 @@ "dev": true }, "pg-minify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.5.1.tgz", - "integrity": "sha512-nqUTo8y9T0VhiJoWC0sK0+2S8hYDiu7CdH0Z9ijPi2iikiQ44mfcAFxEJxfvF8H3h/bDBvXthtOQPIB3pLWIow==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.5.2.tgz", + "integrity": "sha512-uZn/gXkGmO5JBdopxNLSpFMS1lXr+KJqynI8Di1Qyr8ZVXt67ruh+XNfzLMVdLzYv+MQRdNYQdVwWPSs0qM7xQ==", + "dev": true + }, + "pg-packet-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", + "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==", "dev": true }, "pg-pool": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.7.tgz", - "integrity": "sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz", + "integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==", "dev": true }, + "pg-promise": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.4.3.tgz", + "integrity": "sha512-hdZTQ/NlqSlhKM9bMgDhKFiJX+hTuxUygEu1NBjGUtdTdenvnrxjaheeob6OEIxiYSmZFMG8uIsoVCIIPMgCsg==", + "dev": true, + "requires": { + "assert-options": "0.6.1", + "pg": "7.18.1", + "pg-minify": "1.5.2", + "spex": "3.0.1" + } + }, "pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", @@ -13649,6 +13924,11 @@ } } }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -13751,6 +14031,18 @@ "prop-types": "^15.6.2" } }, + "react-ace": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-8.0.0.tgz", + "integrity": "sha512-EvU14vXbZpAenb1ZVKdn8yTQs/shZ9RghFulHtt67bBXT6sjrNHcfOEXHYtSEmwMb6pQVVNNuulzzd8o+Uouig==", + "requires": { + "ace-builds": "^1.4.6", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + } + }, "react-addons-shallow-compare": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz", @@ -13760,6 +14052,17 @@ "object-assign": "^4.1.0" } }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, "react-codemirror": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/react-codemirror/-/react-codemirror-1.0.0.tgz", @@ -13846,6 +14149,17 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" }, + "react-json-view": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.19.1.tgz", + "integrity": "sha512-u5e0XDLIs9Rj43vWkKvwL8G3JzvXSl6etuS5G42a8klMohZuYFQzSN6ri+/GiBptDqlrXPTdExJVU7x9rrlXhg==", + "requires": { + "flux": "^3.1.3", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^6.1.0" + } + }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", @@ -13945,6 +14259,14 @@ "scheduler": "^0.18.0" } }, + "react-textarea-autosize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz", + "integrity": "sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A==", + "requires": { + "prop-types": "^15.6.0" + } + }, "react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -14045,14 +14367,24 @@ } }, "redis": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", - "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.0.tgz", + "integrity": "sha512-EvXfmZoixkHAtM4FAPPIm6utLLzbtSNj3kMNlyxmi3K9jxzXnbYwlOnwGAwOP8bhADLfm/ma8I9R6aPwGzpPIg==", "dev": true, "requires": { - "double-ended-queue": "^2.1.0-0", - "redis-commands": "^1.2.0", - "redis-parser": "^2.6.0" + "denque": "^1.4.1", + "prettier": "^1.19.1", + "redis-commands": "^1.5.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "dependencies": { + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + } } }, "redis-commands": { @@ -14061,12 +14393,21 @@ "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==", "dev": true }, - "redis-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", - "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", "dev": true }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "dev": true, + "requires": { + "redis-errors": "^1.0.0" + } + }, "reduce-reducers": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.4.3.tgz", @@ -14938,12 +15279,6 @@ } } }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -15091,9 +15426,9 @@ } }, "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "dev": true }, "snapdragon": { @@ -15204,13 +15539,13 @@ } }, "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { @@ -15325,9 +15660,9 @@ "dev": true }, "spex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spex/-/spex-3.0.0.tgz", - "integrity": "sha512-JoMfgbrJcEPn53JCLkSNH1o7fZ9rzkb24UKEt5LTcsp0YsaN+yxtb5MEmibbMRltj9CdXDNGitPrYi11JY2hog==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spex/-/spex-3.0.1.tgz", + "integrity": "sha512-priWZUrXBmVPHTOmtUeS7gZzCOUwRK87OHJw5K8bTC6MLOq93mQocx+vWccNyKPT2EY+goZvKGguGn2lx8TBDA==", "dev": true }, "split": { @@ -15758,16 +16093,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "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": "^1.7.0", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -15785,6 +16120,12 @@ "ajv-keywords": "^3.1.0" } }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16827,9 +17168,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -16839,63 +17180,22 @@ } } }, - "winston-compat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.4.tgz", - "integrity": "sha512-mMEfFsSm6GmkFF+f4/0UJtG4N1vSaczGmXLVJYmS/+u2zUaIPcw2ZRuwUg2TvVBjswgiraN+vNnAG8z4fRUZ4w==", - "dev": true, - "requires": { - "cycle": "~1.0.3", - "logform": "^1.6.0", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "logform": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", - "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", - "dev": true, - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", - "ms": "^2.1.1", - "triple-beam": "^1.2.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "winston-daily-rotate-file": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.10.0.tgz", - "integrity": "sha512-KO8CfbI2CvdR3PaFApEH02GPXiwJ+vbkF1mCkTlvRIoXFI8EFlf1ACcuaahXTEiDEKCii6cNe95gsL4ZkbnphA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.4.0.tgz", + "integrity": "sha512-1JHFqpqkZphLZPUDQBoJpcBj2cy/aZkOXlcHcZa3oVcNXxuenptGGXztI07jqTJ/FJdUPm1MOLwrp09zPFIUew==", "dev": true, "requires": { - "file-stream-rotator": "^0.4.1", - "object-hash": "^1.3.0", - "semver": "^6.2.0", + "file-stream-rotator": "^0.5.5", + "object-hash": "^2.0.1", "triple-beam": "^1.3.0", - "winston-compat": "^0.1.4", "winston-transport": "^4.2.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, diff --git a/package.json b/package.json index 9583cab68f..d50bbe663b 100644 --- a/package.json +++ b/package.json @@ -60,10 +60,12 @@ "prop-types": "15.7.2", "query-string": "6.10.1", "react": "16.12.0", + "react-ace": "^8.0.0", "react-dnd": "10.0.2", "react-dnd-html5-backend": "10.0.2", "react-dom": "16.12.0", "react-helmet": "5.2.1", + "react-json-view": "^1.19.1", "react-redux": "7.2.0", "react-router": "5.1.2", "react-router-dom": "5.1.2", @@ -90,7 +92,7 @@ "http-server": "0.12.0", "jest": "24.8.0", "marked": "0.8.0", - "node-sass": "4.13.0", + "node-sass": "^4.13.1", "null-loader": "^3.0.0", "parse-server": "github:parseplatform/parse-server#master", "path-to-regexp": "3.2.0", diff --git a/src/components/BrowserFilter/BrowserFilter.react.js b/src/components/BrowserFilter/BrowserFilter.react.js index 89c7c587a8..6835f31d44 100644 --- a/src/components/BrowserFilter/BrowserFilter.react.js +++ b/src/components/BrowserFilter/BrowserFilter.react.js @@ -29,7 +29,7 @@ export default class BrowserFilter extends React.Component { filters: new List(), blacklistedFilters: BLACKLISTED_FILTERS.concat(props.blacklistedFilters) }; - this.toggle = this.toggle.bind(this) + this.toggle = this.toggle.bind(this); } componentDidMount() { @@ -47,11 +47,13 @@ export default class BrowserFilter extends React.Component { if (this.props.filters.size === 0) { let available = Filters.availableFilters(this.props.schema, null, this.state.blacklistedFilters); let field = Object.keys(available)[0]; - filters = new List([new Map({ field: field, constraint: available[field][0] })]); + filters = new List([ + new Map({ field: field, constraint: available[field][0] }) + ]); } this.setState(prevState => ({ open: !prevState.open, - filters: filters, + filters: filters })); this.props.setCurrent(null); } @@ -60,7 +62,9 @@ export default class BrowserFilter extends React.Component { let available = Filters.availableFilters(this.props.schema, this.state.filters, this.state.blacklistedFilters); let field = Object.keys(available)[0]; this.setState(({ filters }) => ({ - filters: filters.push(new Map({ field: field, constraint: available[field][0] })), + filters: filters.push( + new Map({ field: field, constraint: available[field][0] }) + ) })); } @@ -69,14 +73,14 @@ export default class BrowserFilter extends React.Component { } apply() { - let formatted = this.state.filters.map((filter) => { + let formatted = this.state.filters.map(filter => { // TODO: type is unused? /*let type = this.props.schema[filter.get('field')].type; if (Filters.Constraints[filter.get('constraint')].hasOwnProperty('field')) { type = Filters.Constraints[filter.get('constraint')].field; }*/ return filter; - }) + }); this.props.onChange(formatted); } @@ -92,7 +96,10 @@ export default class BrowserFilter extends React.Component { if (this.props.filters.size) { popoverStyle.push(styles.active); } - let available = Filters.availableFilters(this.props.schema, this.state.filters); + let available = Filters.availableFilters( + this.props.schema, + this.state.filters + ); popover = (
this.props.setCurrent(null)} id={POPOVER_CONTENT_ID}> @@ -102,27 +109,33 @@ export default class BrowserFilter extends React.Component { blacklist={this.state.blacklistedFilters} schema={this.props.schema} filters={this.state.filters} - onChange={(filters) => this.setState({ filters: filters })} - renderRow={(props) => 0} />} /> + onChange={filters => this.setState({ filters: filters })} + renderRow={props => ( + 0} /> + )} + />
@@ -135,7 +148,7 @@ export default class BrowserFilter extends React.Component { return (
- + {this.props.filters.size ? 'Filtered' : 'Filter'}
{popover} diff --git a/src/components/ChromeDropdown/ChromeDropdown.react.js b/src/components/ChromeDropdown/ChromeDropdown.react.js index 6f2c38ff68..07000eadd3 100644 --- a/src/components/ChromeDropdown/ChromeDropdown.react.js +++ b/src/components/ChromeDropdown/ChromeDropdown.react.js @@ -77,7 +77,7 @@ export default class ChromeDropdown extends React.Component { widthStyle = { width: measuredWidth }; content = ( this.setState({ open: false })}> -
+
{this.props.options.map((o) => { let key = o; let value = o; diff --git a/src/components/CodeEditor/CodeEditor.example.js b/src/components/CodeEditor/CodeEditor.example.js new file mode 100644 index 0000000000..87ba16cc77 --- /dev/null +++ b/src/components/CodeEditor/CodeEditor.example.js @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +import React from 'react'; +import CodeEditor from 'components/CodeEditor/CodeEditor.react'; + +export const component = CodeEditor; + +export const demos = [ + { + name: 'Simple code editor (only JS support)', + render: () => ( + + ) + } +]; diff --git a/src/components/CodeEditor/CodeEditor.react.js b/src/components/CodeEditor/CodeEditor.react.js new file mode 100644 index 0000000000..a3231bf9a8 --- /dev/null +++ b/src/components/CodeEditor/CodeEditor.react.js @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +import React from 'react'; +import Editor from 'react-ace'; +import PropTypes from '../../lib/PropTypes'; + +import 'ace-builds/src-noconflict/mode-javascript'; +import 'ace-builds/src-noconflict/theme-solarized_dark'; +import 'ace-builds/src-noconflict/snippets/javascript'; +import 'ace-builds/src-noconflict/ext-language_tools'; + +export default class CodeEditor extends React.Component { + constructor(props) { + super(props); + + this.state = { code: '' }; + } + + get value() { + return this.state.code || this.props.placeHolder; + } + + set value(code) { + this.setState({ code }); + } + + render() { + const { placeHolder, fontSize = 18 } = this.props; + const { code } = this.state; + + return ( + this.setState({ code: value })} + fontSize={fontSize} + showPrintMargin={true} + showGutter={true} + highlightActiveLine={true} + width="100%" + value={code || placeHolder} + enableBasicAutocompletion={true} + enableLiveAutocompletion={true} + enableSnippets={false} + showLineNumbers={true} + tabSize={2} + /> + ); + } +} + +CodeEditor.propTypes = { + fontSize: PropTypes.number.describe('Font size of the editor'), + placeHolder: PropTypes.string.describe('Code place holder') +}; diff --git a/src/components/FormTable/FormTable.example.js b/src/components/FormTable/FormTable.example.js index e969e675d9..778dbb0a6b 100644 --- a/src/components/FormTable/FormTable.example.js +++ b/src/components/FormTable/FormTable.example.js @@ -37,7 +37,7 @@ export const demos = [ { title: 'Title', color: 'red', - onDelete: () => {alert("Delete button clicked.")}, + onDelete: () => {alert('Delete button clicked.')}, notes: [ { key: 'foo', diff --git a/src/components/GeoPointEditor/GeoPointEditor.react.js b/src/components/GeoPointEditor/GeoPointEditor.react.js index 15d57f0a22..9fa8c490c1 100644 --- a/src/components/GeoPointEditor/GeoPointEditor.react.js +++ b/src/components/GeoPointEditor/GeoPointEditor.react.js @@ -92,7 +92,7 @@ export default class GeoPointEditor extends React.Component { let value = e.target.value; if (!validateNumeric(value)) { - var values = value.split(","); + var values = value.split(','); if (values.length == 2) { values = values.map(val => val.trim()); diff --git a/src/components/Popover/Popover.react.js b/src/components/Popover/Popover.react.js index 5b546e98f0..fb5ed01b9e 100644 --- a/src/components/Popover/Popover.react.js +++ b/src/components/Popover/Popover.react.js @@ -88,7 +88,7 @@ export default class Popover extends React.Component { const popoverWrapper = contentId ? document.getElementById(contentId) : this._popoverWrapper; - const isChromeDropdown = e.target.parentNode.classList.contains("chromeDropdown"); + const isChromeDropdown = e.target.parentNode.classList.contains('chromeDropdown'); if ( !hasAncestor(e.target, popoverWrapper) && this.props.onExternalClick && diff --git a/src/components/PushAudienceDialog/InstallationCondition.react.js b/src/components/PushAudienceDialog/InstallationCondition.react.js index 812cb67697..b9f3b68564 100644 --- a/src/components/PushAudienceDialog/InstallationCondition.react.js +++ b/src/components/PushAudienceDialog/InstallationCondition.react.js @@ -51,7 +51,7 @@ function compareValue(info, value, onChangeCompareTo) { return onChangeCompareTo(_value === 'True')} > - {["True", "False"].map(value => )} + {['True', 'False'].map(value => )} case 'Number': return onChangeCompareTo(validateNumeric(_value) ? Number(_value) : Number(value))} ref={setFocus}/>; diff --git a/src/components/TextInput/TextInput.react.js b/src/components/TextInput/TextInput.react.js index 702bd5d66f..8c3edf752a 100644 --- a/src/components/TextInput/TextInput.react.js +++ b/src/components/TextInput/TextInput.react.js @@ -17,7 +17,7 @@ export default class TextInput extends React.Component { setTimeout(function() { const newInput = previousInput ? this.refs.textarea : this.refs.input; newInput.focus(); - newInput.value = ""; + newInput.value = ''; newInput.value = props.value; }.bind(this), 1); } diff --git a/src/components/Toolbar/Toolbar.scss b/src/components/Toolbar/Toolbar.scss index 9713fa492b..6d6ff06820 100644 --- a/src/components/Toolbar/Toolbar.scss +++ b/src/components/Toolbar/Toolbar.scss @@ -5,7 +5,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. */ -@import 'stylesheets/globals.scss'; +@import "stylesheets/globals.scss"; .toolbar { position: fixed; @@ -16,6 +16,7 @@ height: 96px; color: white; transition: left 0.5s ease-in; + z-index: 5; } @media (max-width: 980px) { diff --git a/src/dashboard/Analytics/Retention/Retention.react.js b/src/dashboard/Analytics/Retention/Retention.react.js index b734e84a31..5fe7e4a905 100644 --- a/src/dashboard/Analytics/Retention/Retention.react.js +++ b/src/dashboard/Analytics/Retention/Retention.react.js @@ -139,7 +139,7 @@ export default class Retention extends DashboardView { let dayData = this.state.retentions['days_old_' + daysAgo]['day_' + daysAgo]; let date = DateUtils.daysFrom(this.state.date, -daysAgo); let formattedDate = DateUtils.monthDayStringUTC(date); - let formattedDateSplit = formattedDate.split(" "); + let formattedDateSplit = formattedDate.split(' '); let formattedDateMonth = formattedDateSplit[0]; let formattedDateDay = formattedDateSplit[1]; @@ -171,9 +171,9 @@ export default class Retention extends DashboardView { if (!this.state.retentions || Object.keys(this.state.retentions).length === 0) { chart = ( window.location = 'https://parse.com/apps/quickstart'} /> ); diff --git a/src/dashboard/Dashboard.js b/src/dashboard/Dashboard.js index dd33e4dce2..6ccc04bc2b 100644 --- a/src/dashboard/Dashboard.js +++ b/src/dashboard/Dashboard.js @@ -56,6 +56,7 @@ import { import { Route, Redirect } from 'react-router-dom'; import createClass from 'create-react-class'; import { Helmet } from 'react-helmet'; +import Playground from './Data/Playground/Playground.react'; const ShowSchemaOverview = false; //In progress features. Change false to true to work on this feature. @@ -100,6 +101,9 @@ const PARSE_DOT_COM_SERVER_INFO = { update: true, delete: true, }, + playground: { + evalCode: true + } }, parseServerVersion: 'Parse.com', } @@ -139,21 +143,21 @@ export default class Dashboard extends React.Component { app.serverInfo = { error: 'unable to connect to server', enabledFeatures: {}, - parseServerVersion: "unknown" + parseServerVersion: 'unknown' } return Promise.resolve(app); } else if (error.code === 107) { app.serverInfo = { error: 'server version too low', enabledFeatures: {}, - parseServerVersion: "unknown" + parseServerVersion: 'unknown' } return Promise.resolve(app); } else { app.serverInfo = { error: error.message || 'unknown error', enabledFeatures: {}, - parseServerVersion: "unknown" + parseServerVersion: 'unknown' } return Promise.resolve(app); } @@ -260,6 +264,11 @@ export default class Dashboard extends React.Component { )} /> + ( + + + + )} /> ) diff --git a/src/dashboard/Data/ApiConsole/ApiConsole.react.js b/src/dashboard/Data/ApiConsole/ApiConsole.react.js index 37bf78ac54..46ab64cef9 100644 --- a/src/dashboard/Data/ApiConsole/ApiConsole.react.js +++ b/src/dashboard/Data/ApiConsole/ApiConsole.react.js @@ -5,12 +5,11 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. */ -import React from 'react' -import CategoryList from 'components/CategoryList/CategoryList.react' -import DashboardView from 'dashboard/DashboardView.react' +import React from 'react'; +import CategoryList from 'components/CategoryList/CategoryList.react'; +import DashboardView from 'dashboard/DashboardView.react'; export default class ApiConsole extends DashboardView { - constructor() { super(); this.section = 'Core'; @@ -18,21 +17,23 @@ export default class ApiConsole extends DashboardView { } renderSidebar() { - const { path } = this.props.match - const current = path.substr(path.lastIndexOf('/') + 1, path.length - 1) + const { path } = this.props.match; + const current = path.substr(path.lastIndexOf('/') + 1, path.length - 1); return ( - - ) + + ); } renderContent() { const child = React.Children.only(this.props.children); - return React.cloneElement( - child, - { ...child.props } - ) + return React.cloneElement(child, { ...child.props }); } } diff --git a/src/dashboard/Data/Browser/Browser.react.js b/src/dashboard/Data/Browser/Browser.react.js index c7cc09332f..c2a6d04ba0 100644 --- a/src/dashboard/Data/Browser/Browser.react.js +++ b/src/dashboard/Data/Browser/Browser.react.js @@ -542,8 +542,8 @@ class Browser extends DashboardView { obj.set(attr, value); } obj.save(null, { useMasterKey: true }).then((objectSaved) => { - const createdOrUpdated = isNewObject ? "created" : "updated"; - let msg = objectSaved.className + " with id '" + objectSaved.id + "' " + createdOrUpdated; + const createdOrUpdated = isNewObject ? 'created' : 'updated'; + let msg = objectSaved.className + ' with id \'' + objectSaved.id + '\' ' + createdOrUpdated; this.showNote(msg, false); const state = { data: this.state.data }; @@ -650,9 +650,9 @@ class Browser extends DashboardView { let deletedNote; if (toDeleteObjectIds.length == 1) { - deletedNote = className + " with id '" + toDeleteObjectIds[0] + "' deleted"; + deletedNote = className + ' with id \'' + toDeleteObjectIds[0] + '\' deleted'; } else { - deletedNote = toDeleteObjectIds.length + " " + className + " objects deleted"; + deletedNote = toDeleteObjectIds.length + ' ' + className + ' objects deleted'; } this.showNote(deletedNote, false); @@ -676,17 +676,17 @@ class Browser extends DashboardView { if (error.code === Parse.Error.AGGREGATE_ERROR) { if (error.errors.length == 1) { - errorDeletingNote = "Error deleting " + className + " with id '" + error.errors[0].object.id + "'"; + errorDeletingNote = 'Error deleting ' + className + ' with id \'' + error.errors[0].object.id + '\''; } else if (error.errors.length < toDeleteObjectIds.length) { - errorDeletingNote = "Error deleting " + error.errors.length + " out of " + toDeleteObjectIds.length + " " + className + " objects"; + errorDeletingNote = 'Error deleting ' + error.errors.length + ' out of ' + toDeleteObjectIds.length + ' ' + className + ' objects'; } else { - errorDeletingNote = "Error deleting all " + error.errors.length + " " + className + " objects"; + errorDeletingNote = 'Error deleting all ' + error.errors.length + ' ' + className + ' objects'; } } else { if (toDeleteObjectIds.length == 1) { - errorDeletingNote = "Error deleting " + className + " with id '" + toDeleteObjectIds[0] + "'"; + errorDeletingNote = 'Error deleting ' + className + ' with id \'' + toDeleteObjectIds[0] + '\''; } else { - errorDeletingNote = "Error deleting " + toDeleteObjectIds.length + " " + className + " objects"; + errorDeletingNote = 'Error deleting ' + toDeleteObjectIds.length + ' ' + className + ' objects'; } } @@ -1131,7 +1131,7 @@ class Browser extends DashboardView { // at this moment only one row must be selected, so take the first and only one const selectedKey = Object.keys(selection)[0]; // if selectedKey is string "undefined" => new row column 'objectId' was clicked - let selectedId = selectedKey === "undefined" ? undefined : selectedKey; + let selectedId = selectedKey === 'undefined' ? undefined : selectedKey; // if selectedId is undefined and newObject is null it means new row was just saved and added to data array const isJustSavedObject = selectedId === undefined && newObject === null; // if new object just saved, remove new row selection and select new added row diff --git a/src/dashboard/Data/Browser/BrowserToolbar.react.js b/src/dashboard/Data/Browser/BrowserToolbar.react.js index c1e6b943c4..ced295f249 100644 --- a/src/dashboard/Data/Browser/BrowserToolbar.react.js +++ b/src/dashboard/Data/Browser/BrowserToolbar.react.js @@ -110,7 +110,7 @@ let BrowserToolbar = ({ @@ -180,7 +180,7 @@ let BrowserToolbar = ({ details={details.join(' \u2022 ')} > {onAddRow && ( - + Add Row diff --git a/src/dashboard/Data/Browser/EditRowDialog.react.js b/src/dashboard/Data/Browser/EditRowDialog.react.js index 0e7e377fe5..5982620d4b 100644 --- a/src/dashboard/Data/Browser/EditRowDialog.react.js +++ b/src/dashboard/Data/Browser/EditRowDialog.react.js @@ -1,20 +1,20 @@ -import React from "react"; -import Parse from "parse"; -import { dateStringUTC } from "lib/DateUtils"; -import PropTypes from "lib/PropTypes"; -import ParseApp from "lib/ParseApp"; -import { ContextProxy } from "components/Popover/Popover.react.js"; -import Modal from "components/Modal/Modal.react"; -import Field from "components/Field/Field.react"; -import Label from "components/Label/Label.react"; -import TextInput from "components/TextInput/TextInput.react"; -import DateTimeInput from "components/DateTimeInput/DateTimeInput.react"; -import Toggle from "components/Toggle/Toggle.react"; -import Pill from "components/Pill/Pill.react"; -import GeoPointEditor from "components/GeoPointEditor/GeoPointEditor.react"; -import FileEditor from "components/FileEditor/FileEditor.react"; -import ObjectPickerDialog from "dashboard/Data/Browser/ObjectPickerDialog.react"; -import styles from "dashboard/Data/Browser/Browser.scss"; +import React from 'react'; +import Parse from 'parse'; +import { dateStringUTC } from 'lib/DateUtils'; +import PropTypes from 'lib/PropTypes'; +import ParseApp from 'lib/ParseApp'; +import { ContextProxy } from 'components/Popover/Popover.react.js'; +import Modal from 'components/Modal/Modal.react'; +import Field from 'components/Field/Field.react'; +import Label from 'components/Label/Label.react'; +import TextInput from 'components/TextInput/TextInput.react'; +import DateTimeInput from 'components/DateTimeInput/DateTimeInput.react'; +import Toggle from 'components/Toggle/Toggle.react'; +import Pill from 'components/Pill/Pill.react'; +import GeoPointEditor from 'components/GeoPointEditor/GeoPointEditor.react'; +import FileEditor from 'components/FileEditor/FileEditor.react'; +import ObjectPickerDialog from 'dashboard/Data/Browser/ObjectPickerDialog.react'; +import styles from 'dashboard/Data/Browser/Browser.scss'; export default class EditRowDialog extends React.Component { constructor(props) { @@ -51,24 +51,24 @@ export default class EditRowDialog extends React.Component { const openObjectPickers = {}; columns.forEach(column => { const { name, type } = column; - if (["Array", "Object"].indexOf(type) >= 0) { + if (['Array', 'Object'].indexOf(type) >= 0) { currentObject[name] = JSON.stringify(currentObject[name], null, 2); } - if (type === "Polygon") { + if (type === 'Polygon') { currentObject[name] = JSON.stringify( (currentObject[name] && currentObject[name].coordinates) || [ - ["lat", "lon"] + ['lat', 'lon'] ], null, 2 ); } - if (type === "Pointer") { + if (type === 'Pointer') { currentObject[name] = - (currentObject[name] && currentObject[name].id) || ""; + (currentObject[name] && currentObject[name].id) || ''; openObjectPickers[name] = false; } - if (type === "Relation") { + if (type === 'Relation') { openObjectPickers[name] = false; } }); @@ -83,12 +83,12 @@ export default class EditRowDialog extends React.Component { } handleChange(newValue, name, type, targetClass, toDelete) { - if (name == "password") { - if (newValue === "") { + if (name == 'password') { + if (newValue === '') { return false; } else { const { currentObject } = this.state; - currentObject.password = ""; + currentObject.password = ''; } } const { @@ -97,7 +97,7 @@ export default class EditRowDialog extends React.Component { updateRow, confirmAttachSelectedRows } = this.props; - if (type === "Relation") { + if (type === 'Relation') { if (toDelete.length > 0) { selectedObject[name].remove(toDelete); selectedObject[name].parent.save(null, { useMasterKey: true }); @@ -113,17 +113,17 @@ export default class EditRowDialog extends React.Component { } this.toggleObjectPicker(name, false); } else { - if (["Array", "Object", "Polygon"].indexOf(type) >= 0) { + if (['Array', 'Object', 'Polygon'].indexOf(type) >= 0) { const { currentObject } = this.state; currentObject[name] = JSON.stringify(newValue, null, 2); - if (type === "Polygon") { + if (type === 'Polygon') { newValue = { __type: type, coordinates: newValue }; } } - if (type === "Pointer") { + if (type === 'Pointer') { // when Pointer newValue is array with length 0 or 1 const pointerId = newValue[0]; newValue = pointerId @@ -141,7 +141,7 @@ export default class EditRowDialog extends React.Component { openAcl() { const { selectedObject, columns, handleShowAcl } = this.props; const { row } = selectedObject; - const col = columns.findIndex(c => c.name === "ACL"); + const col = columns.findIndex(c => c.name === 'ACL'); handleShowAcl(row, col); } @@ -171,7 +171,7 @@ export default class EditRowDialog extends React.Component { const { name, type, targetClass } = column; const isHidden = - ["objectId", "createdAt", "updatedAt", "ACL"].indexOf(name) >= 0; + ['objectId', 'createdAt', 'updatedAt', 'ACL'].indexOf(name) >= 0; if (isHidden) { return; @@ -180,22 +180,22 @@ export default class EditRowDialog extends React.Component { let inputComponent; const isDisabled = - (className === "_User" && ["authData"].indexOf(name) >= 0) || + (className === '_User' && ['authData'].indexOf(name) >= 0) || (selectedObject.id && - className === "_Role" && - ["name"].indexOf(name) >= 0) || - (className === "_Session" && + className === '_Role' && + ['name'].indexOf(name) >= 0) || + (className === '_Session' && [ - "sessionToken", - "expiresAt", - "user", - "createdWith", - "installationId", - "restricted" + 'sessionToken', + 'expiresAt', + 'user', + 'createdWith', + 'installationId', + 'restricted' ].indexOf(name) >= 0); switch (type) { - case "String": + case 'String': inputComponent = ( this.updateCurrentObject(newValue, name)} onBlur={newValue => this.handleChange(newValue, name)} /> ); break; - case "Number": + case 'Number': inputComponent = ( ); break; - case "Array": - case "Object": - case "Polygon": + case 'Array': + case 'Object': + case 'Polygon': inputComponent = ( ); break; - case "Boolean": + case 'Boolean': inputComponent = isDisabled ? ( ) : ( @@ -247,7 +247,7 @@ export default class EditRowDialog extends React.Component { /> ); break; - case "Date": + case 'Date': inputComponent = ( ); break; - case "GeoPoint": + case 'GeoPoint': inputComponent = ( -
+
this.handleChange(newValue, name)} />
); break; - case "File": + case 'File': inputComponent = ( -
+
this.handleChange(newValue, name)} />
); break; - case "Pointer": + case 'Pointer': const pointerId = selectedObject[name] && selectedObject[name].id; inputComponent = openObjectPickers[name] ? ( @@ -297,9 +297,9 @@ export default class EditRowDialog extends React.Component { ) : (
{pointerId && ( @@ -315,7 +315,7 @@ export default class EditRowDialog extends React.Component {
); break; - case "Relation": + case 'Relation': // fallback if selectedObject is just saved, so it still doesn't have relation properites set const relation = selectedObject[name] || new Parse.Relation(selectedObject, name); @@ -338,9 +338,9 @@ export default class EditRowDialog extends React.Component { selectedObject.id && (
+
{selectedObject.createdAt && (

- CreatedAt{" "} + CreatedAt{' '} {dateStringUTC(selectedObject.createdAt)}

)} {selectedObject.updatedAt && (

- UpdatedAt{" "} + UpdatedAt{' '} {dateStringUTC(selectedObject.updatedAt)}

)} diff --git a/src/dashboard/Data/Browser/ExportDialog.react.js b/src/dashboard/Data/Browser/ExportDialog.react.js index 1bba7e155f..6a368333da 100644 --- a/src/dashboard/Data/Browser/ExportDialog.react.js +++ b/src/dashboard/Data/Browser/ExportDialog.react.js @@ -47,7 +47,7 @@ export default class ExportDialog extends React.Component { icon='down-outline' iconSize={40} title='Export this class' - subtitle={`We'll send you an email when your data is ready.`} + subtitle={'We\'ll send you an email when your data is ready.'} confirmText='Export' cancelText='Cancel' disabled={this.state.progress === undefined || inProgress} diff --git a/src/dashboard/Data/Browser/ObjectPickerDialog.react.js b/src/dashboard/Data/Browser/ObjectPickerDialog.react.js index ce0222af65..8f2df5cd68 100644 --- a/src/dashboard/Data/Browser/ObjectPickerDialog.react.js +++ b/src/dashboard/Data/Browser/ObjectPickerDialog.react.js @@ -1,25 +1,25 @@ -import React from "react"; -import { List } from "immutable"; -import Parse from "parse"; -import * as ColumnPreferences from "lib/ColumnPreferences"; -import queryFromFilters from "lib/queryFromFilters"; -import PropTypes from "lib/PropTypes"; -import ParseApp from "lib/ParseApp"; -import { ContextProxy } from "components/Popover/Popover.react.js"; -import Modal from "components/Modal/Modal.react"; -import Button from "components/Button/Button.react"; -import TextInput from "components/TextInput/TextInput.react"; -import DataBrowser from "dashboard/Data/Browser/DataBrowser.react"; -import stylesBrowser from "dashboard/Data/Browser/Browser.scss"; -import stylesBrowserFilter from "components/BrowserFilter/BrowserFilter.scss"; -import stylesToolbar from "components/Toolbar/Toolbar.scss"; -import stylesColumnsConfiguration from "components/ColumnsConfiguration/ColumnsConfiguration.scss"; -import stylesDataBrowserHeaderBar from "components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss"; -import stylesFooter from "components/Modal/Modal.scss"; +import React from 'react'; +import { List } from 'immutable'; +import Parse from 'parse'; +import * as ColumnPreferences from 'lib/ColumnPreferences'; +import queryFromFilters from 'lib/queryFromFilters'; +import PropTypes from 'lib/PropTypes'; +import ParseApp from 'lib/ParseApp'; +import { ContextProxy } from 'components/Popover/Popover.react.js'; +import Modal from 'components/Modal/Modal.react'; +import Button from 'components/Button/Button.react'; +import TextInput from 'components/TextInput/TextInput.react'; +import DataBrowser from 'dashboard/Data/Browser/DataBrowser.react'; +import stylesBrowser from 'dashboard/Data/Browser/Browser.scss'; +import stylesBrowserFilter from 'components/BrowserFilter/BrowserFilter.scss'; +import stylesToolbar from 'components/Toolbar/Toolbar.scss'; +import stylesColumnsConfiguration from 'components/ColumnsConfiguration/ColumnsConfiguration.scss'; +import stylesDataBrowserHeaderBar from 'components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss'; +import stylesFooter from 'components/Modal/Modal.scss'; // The initial and max amount of rows fetched by lazy loading const MAX_ROWS_FETCHED = 200; -const SELECTION_INPUT_ID = "selectionInput"; +const SELECTION_INPUT_ID = 'selectionInput'; export default class ObjectPickerDialog extends React.Component { constructor(props, context) { @@ -31,11 +31,11 @@ export default class ObjectPickerDialog extends React.Component { filteredCounts: {}, filters: new List(), lastMax: -1, - ordering: "-createdAt", + ordering: '-createdAt', selection: {}, // initial relation ids -> currently saved in database initialRelationData: [], - selectionInput: "", + selectionInput: '', disableDataBrowserKeyControls: false }; @@ -63,13 +63,13 @@ export default class ObjectPickerDialog extends React.Component { } document .getElementById(SELECTION_INPUT_ID) - .addEventListener("focus", this.disableDataBrowserKeyControls); + .addEventListener('focus', this.disableDataBrowserKeyControls); } componentWillUnmount() { document .getElementById(SELECTION_INPUT_ID) - .addEventListener("focus", this.disableDataBrowserKeyControls); + .addEventListener('focus', this.disableDataBrowserKeyControls); } disableDataBrowserKeyControls() { @@ -100,10 +100,10 @@ export default class ObjectPickerDialog extends React.Component { async fetchParseData(source, filters) { const query = queryFromFilters(source, filters); - const sortDir = this.state.ordering[0] === "-" ? "-" : "+"; - const field = this.state.ordering.substr(sortDir === "-" ? 1 : 0); + const sortDir = this.state.ordering[0] === '-' ? '-' : '+'; + const field = this.state.ordering.substr(sortDir === '-' ? 1 : 0); - if (sortDir === "-") { + if (sortDir === '-') { query.descending(field); } else { query.ascending(field); @@ -130,31 +130,31 @@ export default class ObjectPickerDialog extends React.Component { let className = this.props.className; let source = this.state.relation || className; let query = queryFromFilters(source, this.state.filters); - if (this.state.ordering !== "-createdAt") { + if (this.state.ordering !== '-createdAt') { // Construct complex pagination query let equalityQuery = queryFromFilters(source, this.state.filters); let field = this.state.ordering; let ascending = true; let comp = this.state.data[this.state.data.length - 1].get(field); - if (field === "objectId" || field === "-objectId") { + if (field === 'objectId' || field === '-objectId') { comp = this.state.data[this.state.data.length - 1].id; } - if (field[0] === "-") { + if (field[0] === '-') { field = field.substr(1); query.lessThan(field, comp); ascending = false; } else { query.greaterThan(field, comp); } - if (field === "createdAt") { + if (field === 'createdAt') { equalityQuery.greaterThan( - "createdAt", - this.state.data[this.state.data.length - 1].get("createdAt") + 'createdAt', + this.state.data[this.state.data.length - 1].get('createdAt') ); } else { equalityQuery.lessThan( - "createdAt", - this.state.data[this.state.data.length - 1].get("createdAt") + 'createdAt', + this.state.data[this.state.data.length - 1].get('createdAt') ); equalityQuery.equalTo(field, comp); } @@ -166,10 +166,10 @@ export default class ObjectPickerDialog extends React.Component { } } else { query.lessThan( - "createdAt", - this.state.data[this.state.data.length - 1].get("createdAt") + 'createdAt', + this.state.data[this.state.data.length - 1].get('createdAt') ); - query.addDescending("createdAt"); + query.addDescending('createdAt'); } query.limit(MAX_ROWS_FETCHED); @@ -226,23 +226,23 @@ export default class ObjectPickerDialog extends React.Component { const { column } = this.props; this.setState(({ selection, selectionInput }) => { if (checked) { - if (column.type === "Pointer") { + if (column.type === 'Pointer') { selection = {}; } selection[id] = true; } else { delete selection[id]; } - selectionInput = Object.keys(selection).join(", "); + selectionInput = Object.keys(selection).join(', '); return { selection, selectionInput }; }); } updateSelectionFromInput(newValue) { const { column } = this.props; - const isPointer = column.type === "Pointer"; + const isPointer = column.type === 'Pointer'; const newSelection = {}; - newValue.split(", ").some(id => { + newValue.split(', ').some(id => { if (id.length === 10) { newSelection[id] = true; if (isPointer) { @@ -259,7 +259,7 @@ export default class ObjectPickerDialog extends React.Component { onConfirm() { const { onConfirm, column } = this.props; - const isRelation = column.type === "Relation"; + const isRelation = column.type === 'Relation'; const { selection, initialRelationData } = this.state; const currentSelection = Object.keys(selection); const newValue = isRelation @@ -285,10 +285,10 @@ export default class ObjectPickerDialog extends React.Component { disableDataBrowserKeyControls } = this.state; - const columns = { objectId: { type: "String" } }; - const classes = schema.data.get("classes"); + const columns = { objectId: { type: 'String' } }; + const classes = schema.data.get('classes'); classes.get(className).forEach(({ type, targetClass }, name) => { - if (name === "objectId") { + if (name === 'objectId') { return; } const info = { type }; @@ -311,18 +311,18 @@ export default class ObjectPickerDialog extends React.Component { iconSize={30} title={`Select ${column.name}`} subtitle={`${column.type} <${column.targetClass}>`} - width={"80vw"} + width={'80vw'} customFooter={ -
+
@@ -350,10 +350,10 @@ export default class ObjectPickerDialog extends React.Component { stylesBrowserFilter.objectPickerContent, stylesToolbar.objectPickerContent, stylesColumnsConfiguration.objectPickerContent, - column.type === "Pointer" + column.type === 'Pointer' ? stylesDataBrowserHeaderBar.pickerPointer - : "" - ].join(" ")} + : '' + ].join(' ')} >
@@ -368,12 +368,12 @@ export default class ObjectPickerDialog extends React.Component { color="red" width="108px" additionalStyles={{ - height: "22px", - lineHeight: "22px", - padding: "0", - fontSize: "12px", - marginBottom: "9px", - fontFamily: "Source Code Pro, Courier New, monospace" + height: '22px', + lineHeight: '22px', + padding: '0', + fontSize: '12px', + marginBottom: '9px', + fontFamily: 'Source Code Pro, Courier New, monospace' }} onClick={() => this.selectRow(id, false)} /> diff --git a/src/dashboard/Data/Config/DeleteParameterDialog.react.js b/src/dashboard/Data/Config/DeleteParameterDialog.react.js index 4c4d76231d..c3c4ed252e 100644 --- a/src/dashboard/Data/Config/DeleteParameterDialog.react.js +++ b/src/dashboard/Data/Config/DeleteParameterDialog.react.js @@ -46,10 +46,10 @@ export default class DeleteParameterDialog extends React.Component { diff --git a/src/dashboard/Data/Jobs/JobScheduleReminder.react.js b/src/dashboard/Data/Jobs/JobScheduleReminder.react.js index a430195be9..59c09d3a9c 100644 --- a/src/dashboard/Data/Jobs/JobScheduleReminder.react.js +++ b/src/dashboard/Data/Jobs/JobScheduleReminder.react.js @@ -6,14 +6,14 @@ export default class JobScheduleReminder extends React.Component { return (

- {"Be noted that "} - {"parse-server doesn't run the jobs in the scheduled times"} - {" by itself."} + {'Be noted that '} + {'parse-server doesn\'t run the jobs in the scheduled times'} + {' by itself.'}

- {"Please take a look at the "} + {'Please take a look at the '} {'docs'} - {" on how to do that."} + {' on how to do that.'}

); diff --git a/src/dashboard/Data/Jobs/Jobs.react.js b/src/dashboard/Data/Jobs/Jobs.react.js index 0a1651d989..34d23a9d41 100644 --- a/src/dashboard/Data/Jobs/Jobs.react.js +++ b/src/dashboard/Data/Jobs/Jobs.react.js @@ -228,7 +228,7 @@ class Jobs extends TableView { title='Delete job schedule?' subtitle='Careful, this action cannot be undone' confirmText='Yes, delete it' - cancelText={`Never mind, don't`} + cancelText={'Never mind, don\'t'} onCancel={() => this.setState({ toDelete: null })} onConfirm={() => { this.setState({ toDelete: null }); diff --git a/src/dashboard/Data/Migration/Migration.react.js b/src/dashboard/Data/Migration/Migration.react.js index 2a36938ae1..c615a2c16d 100644 --- a/src/dashboard/Data/Migration/Migration.react.js +++ b/src/dashboard/Data/Migration/Migration.react.js @@ -258,7 +258,7 @@ export default class Migration extends DashboardView { let errorMessage = null; switch (this.context.currentApp.migration.wellKnownError) { case 1: - errorMessage = "This is an error state."; + errorMessage = 'This is an error state.'; break; default: errorMessage = this.context.currentApp.migration.migrationState === MIGRATION_INITIALSYNC ? null : ' '; diff --git a/src/dashboard/Data/Playground/Playground.react.js b/src/dashboard/Data/Playground/Playground.react.js new file mode 100644 index 0000000000..be34ccc5e9 --- /dev/null +++ b/src/dashboard/Data/Playground/Playground.react.js @@ -0,0 +1,204 @@ +import React, { Component } from 'react'; +import ReactJson from 'react-json-view'; +import Parse from 'parse'; + +import PropTypes from 'lib/PropTypes'; +import ParseApp from 'lib/ParseApp'; +import CodeEditor from 'components/CodeEditor/CodeEditor.react'; +import Button from 'components/Button/Button.react'; +import SaveButton from 'components/SaveButton/SaveButton.react'; +import Toolbar from 'components/Toolbar/Toolbar.react'; + +import styles from './Playground.scss'; + +export default class Playground extends Component { + constructor() { + super(); + this.section = 'Core'; + this.subsection = 'JS Console'; + this.localKey = 'parse-dashboard-playground-code'; + this.state = { + results: [], + running: false, + saving: false, + savingState: SaveButton.States.WAITING + }; + } + + overrideConsole() { + const originalConsoleLog = console.log; + const originalConsoleError = console.error; + + console.log = (...args) => { + this.setState(({ results }) => ({ + results: [ + ...results, + ...args.map(arg => ({ + log: + typeof arg === 'object' + ? Array.isArray(arg) + ? arg.map(this.getParseObjectAttr) + : this.getParseObjectAttr(arg) + : { result: arg }, + name: 'Log' + })) + ] + })); + + originalConsoleLog.apply(console, args); + }; + console.error = (...args) => { + this.setState(({ results }) => ({ + results: [ + ...results, + ...args.map(arg => ({ + log: + arg instanceof Error + ? { message: arg.message, name: arg.name, stack: arg.stack } + : { result: arg }, + name: 'Error' + })) + ] + })); + + originalConsoleError.apply(console, args); + }; + + return [originalConsoleLog, originalConsoleError]; + } + + async runCode() { + const [originalConsoleLog, originalConsoleError] = this.overrideConsole(); + + try { + const { + currentApp: { applicationId, masterKey, serverURL, javascriptKey } + } = this.context; + const originalCode = this.editor.value; + + const finalCode = `return (async function(){ + try{ + Parse.initialize('${applicationId}', ${ + javascriptKey ? `'${javascriptKey}'` : undefined + }); + Parse.masterKey = '${masterKey}'; + Parse.serverUrl = '${serverURL}'; + + ${originalCode} + } catch(e) { + console.error(e); + } + })()`; + + this.setState({ running: true, results: [] }); + + await new Function('Parse', finalCode)(Parse); + } catch (e) { + console.error(e); + } finally { + console.log = originalConsoleLog; + console.error = originalConsoleError; + this.setState({ running: false }); + } + } + + saveCode() { + try { + this.setState({ saving: true, savingState: SaveButton.States.SAVING }); + const code = this.editor.value; + + window.localStorage.setItem(this.localKey, code); + this.setState({ + saving: false, + savingState: SaveButton.States.SUCCEEDED + }); + + setTimeout( + () => this.setState({ savingState: SaveButton.States.WAITING }), + 3000 + ); + } catch (e) { + console.error(e); + this.setState({ saving: false, savingState: SaveButton.States.FAILED }); + } + } + + getParseObjectAttr(parseObject) { + if (parseObject instanceof Parse.Object) { + return parseObject.attributes; + } + + return parseObject; + } + + componentDidMount() { + if (window.localStorage) { + const initialCode = window.localStorage.getItem(this.localKey); + if (initialCode) { + this.editor.value = initialCode; + } + } + } + + render() { + const { results, running, saving, savingState } = this.state; + + return React.cloneElement( +
+ +
+ (this.editor = editor)} + /> +
+
+

Console

+
+
+
+ {window.localStorage && ( + this.saveCode()} + progress={saving} + /> + )} +
+
+
+
+
+ {results.map(({ log, name }, i) => ( + + ))} +
+
+
+
+ ); + } +} + +Playground.contextTypes = { + generatePath: PropTypes.func, + currentApp: PropTypes.instanceOf(ParseApp) +}; diff --git a/src/dashboard/Data/Playground/Playground.scss b/src/dashboard/Data/Playground/Playground.scss new file mode 100644 index 0000000000..6af6efbf0b --- /dev/null +++ b/src/dashboard/Data/Playground/Playground.scss @@ -0,0 +1,47 @@ +.playground-ctn { + padding-top: 96px; + background-color: #002b36; + height: 100vh; +} + +.console-ctn { + display: flex; + align-items: center; + justify-content: stretch; + flex-direction: column; + + & h3 { + height: 28px; + line-height: 28px; + font-size: 16px; + font-weight: 700; + color: white; + } + + & > header { + flex: 1; + padding: 0 0 0 10px; + background-color: #169cee; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + } + + & > section { + width: 100%; + } +} + +.buttons-ctn { + display: flex; + justify-content: flex-end; + padding: 15px; + align-items: center; + + & > div { + display: flex; + justify-content: flex-end; + width: 25%; + } +} diff --git a/src/dashboard/Push/PushAudiencesData.react.js b/src/dashboard/Push/PushAudiencesData.react.js index c0ef783efc..b16a13fbae 100644 --- a/src/dashboard/Push/PushAudiencesData.react.js +++ b/src/dashboard/Push/PushAudiencesData.react.js @@ -151,7 +151,7 @@ export default class PushAudiencesData extends React.Component { let stateSettings = { newSegment: { createdAt: new Date(), - name: "New Segment", + name: 'New Segment', count: 0, objectId: PushConstants.NEW_SEGMENT_ID, query, diff --git a/src/dashboard/Push/PushDetails.react.js b/src/dashboard/Push/PushDetails.react.js index 2c69bed8c6..384d8b85da 100644 --- a/src/dashboard/Push/PushDetails.react.js +++ b/src/dashboard/Push/PushDetails.react.js @@ -398,7 +398,7 @@ class PushDetails extends DashboardView { } else if (statistics) { isFlowView = true; - let headline = statistics.confidence_interval ? `Group {statistics.winner} is the winner!` : 'Not enough data to automatically determine the winner'; + let headline = statistics.confidence_interval ? 'Group {statistics.winner} is the winner!' : 'Not enough data to automatically determine the winner'; let subline = []; let launchGroupFragment = 'These devices are outside test groups A & B.'; diff --git a/src/dashboard/Push/PushNew.react.js b/src/dashboard/Push/PushNew.react.js index 0f9b3e6119..34ba482f2d 100644 --- a/src/dashboard/Push/PushNew.react.js +++ b/src/dashboard/Push/PushNew.react.js @@ -188,7 +188,7 @@ class PushNew extends DashboardView { handlePushSubmit(changes) { let payload = changes.data_type === 'json' ? JSON.parse(changes.data) : { alert: changes.data }; if (changes.increment_badge) { - payload.badge = "Increment"; + payload.badge = 'Increment'; } const push_time = extractPushTime(changes); @@ -213,7 +213,7 @@ class PushNew extends DashboardView { let audience_id = changes.audience_id; // Only set the audience ID if it is a saved audience. - if (audience_id != PushConstants.NEW_SEGMENT_ID && audience_id != "everyone") { + if (audience_id != PushConstants.NEW_SEGMENT_ID && audience_id != 'everyone') { body.audience_id = audience_id; const pushAudience = this.props.pushaudiences.data.get('audiences').toJS() .find((a) => a.objectId === audience_id); @@ -682,7 +682,7 @@ class PushNew extends DashboardView { const timeFieldsDescription = hasScheduledPushSupport ? 'We can send the campaign immediately, or any time in the next 2 weeks.' : - "If your push hasn't been send by this time, it won't get sent."; + 'If your push hasn\'t been send by this time, it won\'t get sent.'; const deliveryTimeFields = hasScheduledPushSupport ?
{ let promise = validateAndSubmitConnectionString( diff --git a/src/dashboard/Settings/HostingSettings.react.js b/src/dashboard/Settings/HostingSettings.react.js index 546756bf54..494cf8b800 100644 --- a/src/dashboard/Settings/HostingSettings.react.js +++ b/src/dashboard/Settings/HostingSettings.react.js @@ -61,7 +61,7 @@ export default class HostingSettings extends DashboardView { labelWidth={62} label={