From 7bd6f04122fd397c39091c3850a41f088fbf8d39 Mon Sep 17 00:00:00 2001 From: charltona <aaron_charlton@flightcentre.com> Date: Sat, 15 Aug 2020 11:52:33 +1000 Subject: [PATCH] divjoy pivot - UNTESTED --- .gitignore | 27 +- .idea/.gitignore | 5 + .idea/locali.iml | 12 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + README.md | 205 +- api/_db.js | 53 + api/_firebase.js | 14 + api/_require-auth.js | 33 + api/newsletter.js | 27 + api/stripe-create-billing-session.js | 25 + api/stripe-create-checkout-session.js | 57 + api/stripe-webhook.js | 99 + dist/fonts/Recoleta-Bold.ttf | Bin 125660 -> 0 bytes dist/fonts/Recoleta-Regular.ttf | Bin 125392 -> 0 bytes divjoy-project.json | 8728 +++++++++++++++++++++++++ firestore.rules | 70 + index.html | 40 - package-lock.json | 8663 ------------------------ package.json | 77 +- public/favicon.ico | Bin 0 -> 3870 bytes public/index.html | 38 + public/manifest.json | 15 + src/components/Auth.js | 63 + src/components/AuthFooter.js | 27 + src/components/AuthFooter.scss | 6 + src/components/AuthForm.js | 150 + src/components/AuthSection.js | 73 + src/components/AuthSocial.js | 103 + src/components/AuthSocial.scss | 15 + src/components/Avatar.js | 19 + src/components/BackgroundImage.js | 16 + src/components/BackgroundImage.scss | 23 + src/components/Contact.js | 123 + src/components/ContactSection.js | 39 + src/components/DashboardSection.js | 107 + src/components/DashboardSection.scss | 5 + src/components/Faq.js | 14 + src/components/FaqItem.js | 27 + src/components/FaqItem.scss | 7 + src/components/FaqSection.js | 58 + src/components/Features.js | 33 + src/components/Features.scss | 23 + src/components/FeaturesSection.js | 58 + src/components/Footer.js | 72 + src/components/Footer.scss | 59 + src/components/FormAlert.js | 13 + src/components/FormField.js | 28 + src/components/HeroSection.js | 48 + src/components/HeroSection.scss | 5 + src/components/HeroSection2.js | 28 + src/components/NavbarCustom.js | 70 + src/components/Newsletter.js | 57 + src/components/NewsletterSection.js | 43 + src/components/PageLoader.js | 23 + src/components/ReauthModal.js | 112 + src/components/Section.js | 48 + src/components/Section.scss | 12 + src/components/SectionHeader.js | 36 + src/components/SectionHeader.scss | 15 + src/components/SettingsBilling.js | 32 + src/components/SettingsGeneral.js | 96 + src/components/SettingsNav.js | 27 + src/components/SettingsPassword.js | 109 + src/components/SettingsSection.js | 94 + src/components/TeamBios.js | 32 + src/components/TeamBiosSection.js | 63 + src/components/Testimonials.js | 26 + src/components/TestimonialsSection.js | 54 + src/components/header/index.js | 37 - src/config/theme/index.js | 21 - src/index.js | 55 +- src/pages/_app.js | 63 + src/pages/about.js | 30 + src/pages/auth.js | 23 + src/pages/contact.js | 22 + src/pages/dashboard.js | 17 + src/pages/faq.js | 18 + src/pages/index.js | 64 + src/pages/not-found.js | 11 + src/pages/settings.js | 22 + src/screens/splash/index.js | 12 - src/serviceWorker.js | 136 + src/styles/global.scss | 56 + src/util/analytics.js | 26 + src/util/auth.js | 299 + src/util/contact.js | 13 + src/util/db.js | 134 + src/util/firebase.js | 14 + src/util/newsletter.js | 7 + src/util/prices.js | 19 + src/util/router.js | 86 + src/util/stripe.js | 36 + src/util/util.js | 36 + 94 files changed, 12793 insertions(+), 8857 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/locali.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 api/_db.js create mode 100644 api/_firebase.js create mode 100644 api/_require-auth.js create mode 100644 api/newsletter.js create mode 100644 api/stripe-create-billing-session.js create mode 100644 api/stripe-create-checkout-session.js create mode 100644 api/stripe-webhook.js delete mode 100644 dist/fonts/Recoleta-Bold.ttf delete mode 100644 dist/fonts/Recoleta-Regular.ttf create mode 100644 divjoy-project.json create mode 100644 firestore.rules delete mode 100644 index.html delete mode 100644 package-lock.json create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 public/manifest.json create mode 100644 src/components/Auth.js create mode 100644 src/components/AuthFooter.js create mode 100644 src/components/AuthFooter.scss create mode 100644 src/components/AuthForm.js create mode 100644 src/components/AuthSection.js create mode 100644 src/components/AuthSocial.js create mode 100644 src/components/AuthSocial.scss create mode 100644 src/components/Avatar.js create mode 100644 src/components/BackgroundImage.js create mode 100644 src/components/BackgroundImage.scss create mode 100644 src/components/Contact.js create mode 100644 src/components/ContactSection.js create mode 100644 src/components/DashboardSection.js create mode 100644 src/components/DashboardSection.scss create mode 100644 src/components/Faq.js create mode 100644 src/components/FaqItem.js create mode 100644 src/components/FaqItem.scss create mode 100644 src/components/FaqSection.js create mode 100644 src/components/Features.js create mode 100644 src/components/Features.scss create mode 100644 src/components/FeaturesSection.js create mode 100644 src/components/Footer.js create mode 100644 src/components/Footer.scss create mode 100644 src/components/FormAlert.js create mode 100644 src/components/FormField.js create mode 100644 src/components/HeroSection.js create mode 100644 src/components/HeroSection.scss create mode 100644 src/components/HeroSection2.js create mode 100644 src/components/NavbarCustom.js create mode 100644 src/components/Newsletter.js create mode 100644 src/components/NewsletterSection.js create mode 100644 src/components/PageLoader.js create mode 100644 src/components/ReauthModal.js create mode 100644 src/components/Section.js create mode 100644 src/components/Section.scss create mode 100644 src/components/SectionHeader.js create mode 100644 src/components/SectionHeader.scss create mode 100644 src/components/SettingsBilling.js create mode 100644 src/components/SettingsGeneral.js create mode 100644 src/components/SettingsNav.js create mode 100644 src/components/SettingsPassword.js create mode 100644 src/components/SettingsSection.js create mode 100644 src/components/TeamBios.js create mode 100644 src/components/TeamBiosSection.js create mode 100644 src/components/Testimonials.js create mode 100644 src/components/TestimonialsSection.js delete mode 100644 src/components/header/index.js delete mode 100644 src/config/theme/index.js create mode 100644 src/pages/_app.js create mode 100644 src/pages/about.js create mode 100644 src/pages/auth.js create mode 100644 src/pages/contact.js create mode 100644 src/pages/dashboard.js create mode 100644 src/pages/faq.js create mode 100644 src/pages/index.js create mode 100644 src/pages/not-found.js create mode 100644 src/pages/settings.js delete mode 100644 src/screens/splash/index.js create mode 100644 src/serviceWorker.js create mode 100644 src/styles/global.scss create mode 100644 src/util/analytics.js create mode 100644 src/util/auth.js create mode 100644 src/util/contact.js create mode 100644 src/util/db.js create mode 100644 src/util/firebase.js create mode 100644 src/util/newsletter.js create mode 100644 src/util/prices.js create mode 100644 src/util/router.js create mode 100644 src/util/stripe.js create mode 100644 src/util/util.js diff --git a/.gitignore b/.gitignore index 65d0df2..8692cf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,24 @@ -/node_modules -/.idea -/.vs +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ea7ed09 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/locali.iml b/.idea/locali.iml new file mode 100644 index 0000000..0b872d8 --- /dev/null +++ b/.idea/locali.iml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="WEB_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$"> + <excludeFolder url="file://$MODULE_DIR$/.tmp" /> + <excludeFolder url="file://$MODULE_DIR$/temp" /> + <excludeFolder url="file://$MODULE_DIR$/tmp" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d9fdae0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="JSX" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9208664 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/locali.iml" filepath="$PROJECT_DIR$/.idea/locali.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/README.md b/README.md index aed13f8..eb80d85 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,199 @@ -# Installation -1. Check out repo -2. npm install -3. npm start => http://localhost:3000 - -test push \ No newline at end of file +## 👉 Get Started + +Install dependencies + +``` +npm install +``` + +Update your `.env` file with values for each environment variable + +``` +API_KEY=AIzaSyBkkFF0XhNZeWuDmOfEhsgdfX1VBG7WTas +etc ... +``` + +Install the Vercel CLI + +``` +npm install -g vercel +``` + +Link your codebase to a Vercel project + +``` +vercel +``` + +Run the development server + +``` +vercel dev +``` + +When the above command completes you'll be able to view your website at `http://localhost:3000`. + +_Note: You can run just the front-end with `npm run start`, but `vercel dev` also handles running your API endpoints (located in the `/api` directory)._ + +## 🥞 Stack + +This project uses the following libraries and services: + +- Framework - [Create React App](https://create-react-app.dev) with React Router +- UI Kit - [Bootstrap](https://react-bootstrap.github.io) +- Authentication - [Firebase Auth](https://firebase.google.com/products/auth) +- Database - [Cloud Firestore](https://firebase.google.com/products/firestore) +- Payments - [Stripe](https://stripe.com) +- Newsletter - [Mailchimp](https://mailchimp.com) +- Contact Form - [Formspree](https://formspree.io) +- Analytics - [Google Analytics](https://googleanalytics.com) +- Hosting - [Vercel](https://vercel.com) + +## 📚 Guide + + <details> + <summary><b>Styles</b></summary> + <p> + You can edit Bootstrap SASS variables in the global stylesheet located at <code><a href="src/styles/global.scss">src/styles/global.scss</a></code>. Variables allow you to control global styles (like colors and fonts), as well as element specific styles (like button padding). Before overriding Bootstrap elements with custom style check the <a href="https://getbootstrap.com/docs/4.3/getting-started/introduction/">Bootstrap docs</a> to see if you can do what need by tweaking a SASS variable. + </p> + <p> + Custom styles are located in their related component's directory. For example, if any custom style is applied to the Navbar component you'll find it in <code>src/components/Navbar.scss</code>. We ensure custom styles are scoped to their component by prepending the classname with the component name (such as <code>.Navbar__brand</code>). This ensures styles never affect elements in other components. If styles need to be re-used in multiple components consider creating a new component that encapsulates that style and structure and using that component in multiple places. + </p> + </details> + + <details> + <summary><b>Routing</b></summary> + <p> + This project uses <a target="_blank" href="https://reacttraining.com/react-router/web/guides/quick-start">React Router</a> and includes a convenient <code>useRouter</code> hook (located in <code><a href="src/util/router.js">src/util/router.js</a></code>) that wraps React Router and gives all the route methods and data you need. + + ```jsx + import { Link, useRouter } from './../util/router.js'; + + function MyComponent(){ + // Get the router object + const router = useRouter(); + + // Get value from query string (?postId=123) or route param (/:postId) + console.log(router.query.postId); + + // Get current pathname + console.log(router.pathname) + + // Navigate with the <Link> component or with router.push() + return ( + <div> + <Link to="/about">About</Link> + <button onClick={(e) => router.push('/about')}>About</button> + </div> + ); + } + ``` + </p> + + </details> + + <details> +<summary><b>Authentication</b></summary> +<p> + This project uses <a href="https://firebase.google.com">Firebase Auth</a> and includes a convenient <code>useAuth</code> hook (located in <code><a href="src/util/auth.js">src/util/auth.js</a></code>) that wraps Firebase and gives you common authentication methods. Depending on your needs you may want to edit this file and expose more Firebase functionality. + +```js +import { useAuth } from './../util/auth.js'; + +function MyComponent(){ + // Get the auth object in any component + const auth = useAuth(); + + // Depending on auth state show signin or signout button + // auth.user will either be an object, null when loading, or false if signed out + return ( + <div> + {auth.user ? ( + <button onClick={(e) => auth.signout()}>Signout</button> + ) : ( + <button onClick={(e) => auth.signin('hello@divjoy.com', 'yolo')}>Signin</button> + )} + </div> + ); +} +``` + +</p> +</details> + + <details> +<summary><b>Database</b></summary> + +<p> + This project uses <a href="https://firebase.google.com/products/firestore">Cloud Firestore</a> and includes some data fetching hooks to get you started (located in <code><a href="src/util/db.js">src/util/db.js</a></code>). You'll want to edit that file and add any additional query hooks you need for your project. + +```js +import { useAuth } from './../util/auth.js'; +import { useItemsByOwner } from './../util/db.js'; +import ItemsList from './ItemsList.js'; + +function ItemsPage(){ + const auth = useAuth(); + + // Fetch items by owner + // It's okay if uid is undefined while auth is still loading + // The hook will return a "loading" status until it has a uid + const uid = auth.user ? auth.user.uid : undefined; + const { data: items, status } = useItemsByOwner(uid); + + // Once we items data then render ItemsList component + return ( + <div> + {status === "loading" ? ( + <span>One moment please</span> + ) : ( + <ItemsList data={items}> + )} + </div> + ); +} +``` + +</p> +</details> + + <details> + <summary><b>Deployment</b></summary> + <p> + Install the Vercel CLI + +``` +npm install -g vercel +``` + +Add each variable from `.env` to your Vercel project with the following command. You'll be prompted to enter its value and then choose one or more environments (development, preview, or production). +<a target="_blank" href="https://vercel.com/docs/v2/build-step#environment-variables">Learn more here</a>. + +``` +vercel env add VARIABLE_NAME +``` + +Run this command to deploy a preview (for testing a live deployment) + +``` +vercel +``` + +Run this command to deploy to production + +``` +vercel --prod +``` + +See the <a target="_blank" href="https://vercel.com/docs/v2/platform/deployments">Vercel docs</a> for more details. +</p> + + </details> + + <details> + <summary><b>Other</b></summary> + <p> + The <a href="https://create-react-app.dev">Create React App documention</a> covers many other topics. + This project was initially created using <a href="https://divjoy.com?ref=readme_other">Divjoy</a>, a React codebase generator. Feel free to ask questions in the <a href="https://spectrum.chat/divjoy">Divjoy forum</a> and we'll do our best to help you out. + </p> + </details> diff --git a/api/_db.js b/api/_db.js new file mode 100644 index 0000000..b460ada --- /dev/null +++ b/api/_db.js @@ -0,0 +1,53 @@ +const firebaseAdmin = require("./_firebase"); + +const firestore = firebaseAdmin.firestore(); + +// Update an existing user +function updateUser(uid, data) { + return firestore.collection("users").doc(uid).update(data); +} + +// Get user by uid +function getUser(uid) { + return firestore.collection("users").doc(uid).get().then(format); +} + +// Get user by stripeCustomerId +function getUserByCustomerId(customerId) { + return firestore + .collection("users") + .where("stripeCustomerId", "==", customerId) + .get() + .then(format) + .then((docs) => (docs ? docs[0] : null)); // Get first result +} + +// Update a user by their stripeCustomerId +function updateUserByCustomerId(customerId, data) { + return getUserByCustomerId(customerId).then((user) => { + return updateUser(user.id, data); + }); +} + +/**** HELPERS ****/ + +// Format Firestore response (handles a collection or single doc) +function format(response) { + if (response.docs) { + return response.docs.map(getDoc); + } else { + return getDoc(response); + } +} + +// Get doc data and merge in doc.id +function getDoc(doc) { + return doc.exists ? { id: doc.id, ...doc.data() } : null; +} + +module.exports = { + updateUser, + getUser, + getUserByCustomerId, + updateUserByCustomerId, +}; diff --git a/api/_firebase.js b/api/_firebase.js new file mode 100644 index 0000000..9f1b65e --- /dev/null +++ b/api/_firebase.js @@ -0,0 +1,14 @@ +const firebaseAdmin = require("firebase-admin"); + +if (!firebaseAdmin.apps.length) { + firebaseAdmin.initializeApp({ + credential: firebaseAdmin.credential.cert({ + projectId: process.env.FIREBASE_PROJECT_ID, + clientEmail: process.env.FIREBASE_CLIENT_EMAIL, + privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, "\n"), + }), + databaseURL: `https://${process.env.FIREBASE_PROJECT_ID}.firebaseio.com`, + }); +} + +module.exports = firebaseAdmin; diff --git a/api/_require-auth.js b/api/_require-auth.js new file mode 100644 index 0000000..5312575 --- /dev/null +++ b/api/_require-auth.js @@ -0,0 +1,33 @@ +const firebaseAdmin = require("./_firebase.js"); + +// Middleware for requiring authentication and getting user +const requireAuth = (fn) => async (req, res) => { + // Respond with error if no authorization header + if (!req.headers.authorization) { + return res.status(401).send({ + status: "error", + message: "You must be signed in to call this endpoint", + }); + } + + // Get access token from authorization header ("Bearer: xxxxxxx") + const accessToken = req.headers.authorization.split(" ")[1]; + + try { + // Get user from token and add to req object + req.user = await firebaseAdmin.auth().verifyIdToken(accessToken); + + // Call route function passed into this middleware + return fn(req, res); + } catch (error) { + // If there's an error assume token is expired and return + // auth/invalid-user-token error (handled by apiRequest in util.js) + res.status(401).send({ + status: "error", + code: "auth/invalid-user-token", + message: "Your login has expired. Please login again.", + }); + } +}; + +module.exports = requireAuth; diff --git a/api/newsletter.js b/api/newsletter.js new file mode 100644 index 0000000..f8af024 --- /dev/null +++ b/api/newsletter.js @@ -0,0 +1,27 @@ +const Mailchimp = require("mailchimp-api-v3"); + +const mailchimpClient = new Mailchimp(process.env.MAILCHIMP_API_KEY); +const audienceId = process.env.MAILCHIMP_AUDIENCE_ID; + +export default (req, res) => { + const body = req.body; + + return mailchimpClient + .request({ + method: "POST", + path: "/lists/" + audienceId + "/members", + body: { + email_address: body.email, + // Set status to "subscribed" to disable double-opt-in + status: "pending", + }, + }) + .then((result) => { + res.send({ status: "success" }); + }) + .catch((error) => { + console.log("newsletter error", error); + + res.send({ status: "error" }); + }); +}; diff --git a/api/stripe-create-billing-session.js b/api/stripe-create-billing-session.js new file mode 100644 index 0000000..0ed4977 --- /dev/null +++ b/api/stripe-create-billing-session.js @@ -0,0 +1,25 @@ +const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY); +const requireAuth = require("./_require-auth.js"); +const { getUser } = require("./_db.js"); + +export default requireAuth(async (req, res) => { + const user = req.user; + + try { + const { stripeCustomerId } = await getUser(user.uid); + + // Create a billing portal session + const session = await stripe.billingPortal.sessions.create({ + customer: stripeCustomerId, + return_url: `${process.env.STRIPE_DOMAIN}/settings/general`, + }); + + // Return success response + res.send({ status: "success", data: session }); + } catch (error) { + console.log("stripe-create-billing-session error", error); + + // Return error response + res.send({ status: "error", code: error.code, message: error.message }); + } +}); diff --git a/api/stripe-create-checkout-session.js b/api/stripe-create-checkout-session.js new file mode 100644 index 0000000..2b67480 --- /dev/null +++ b/api/stripe-create-checkout-session.js @@ -0,0 +1,57 @@ +const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY); +const requireAuth = require("./_require-auth.js"); +const { getUser, updateUser } = require("./_db.js"); + +export default requireAuth(async (req, res) => { + const body = req.body; + const user = req.user; + + try { + let { email, stripeCustomerId } = await getUser(user.uid); + + // If user does not already have a stripeCustomerId then create a customer in Stripe + if (!stripeCustomerId) { + const customer = await stripe.customers.create({ email: email }); + + await updateUser(user.uid, { + stripeCustomerId: customer.id, + }); + + stripeCustomerId = customer.id; + } + + // Create a checkout session + const session = await stripe.checkout.sessions.create({ + customer: stripeCustomerId, + payment_method_types: ["card"], + subscription_data: { + // Use trial period set for this priceId (if there is one) + trial_from_plan: true, + // Uncomment to add a coupon code from request body + //coupon: body.coupon + }, + line_items: [ + { + price: body.priceId, + quantity: 1, + }, + ], + mode: "subscription", + // Uncomment to allow user to enter a promotional code + //allow_promotion_codes: true, + // Uncomment if you need address collection + //billing_address_collection: "required", + //shipping_address_collection: { allowed_countries: ['US'] }, + success_url: `${process.env.STRIPE_DOMAIN}/dashboard?paid=true`, + cancel_url: `${process.env.STRIPE_DOMAIN}/pricing`, + }); + + // Return success response + res.send({ status: "success", data: session }); + } catch (error) { + console.log("stripe-create-checkout-session error", error); + + // Return error response + res.send({ status: "error", code: error.code, message: error.message }); + } +}); diff --git a/api/stripe-webhook.js b/api/stripe-webhook.js new file mode 100644 index 0000000..84d615e --- /dev/null +++ b/api/stripe-webhook.js @@ -0,0 +1,99 @@ +const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY); +const getRawBody = require("raw-body"); +const { updateUserByCustomerId } = require("./_db.js"); + +export default async (req, res) => { + const headers = req.headers; + + try { + const rawBody = await getRawBody(req); + + const stripeEvent = stripe.webhooks.constructEvent( + rawBody, + headers["stripe-signature"], + process.env.STRIPE_WEBHOOK_SECRET + ); + + console.log(`stripeEvent: ${stripeEvent.type}`); + + // Get the object from stripeEvent + const object = stripeEvent.data.object; + + switch (stripeEvent.type) { + case "checkout.session.completed": + // Fetch subscription + const subscription = await stripe.subscriptions.retrieve( + object.subscription + ); + + // Update the current user + await updateUserByCustomerId(object.customer, { + stripeSubscriptionId: subscription.id, + // Store the priceId (or "plan") for this subscription + stripePriceId: subscription.items.data[0].price.id, + // Store the subscription status ("active" or "trialing") + stripeSubscriptionStatus: subscription.status, + }); + + break; + + case "invoice.payment_succeeded": + // If a payment succeeded we update stored subscription status to "active" + // in case it was previously "trialing" or "past_due". + // We skip if amount due is 0 as that's the case at start of trial period. + if (object.amount_due > 0) { + await updateUserByCustomerId(object.customer, { + stripeSubscriptionStatus: "active", + }); + } + + break; + + case "invoice.payment_failed": + // If a payment failed we update stored subscription status to "past_due" + await updateUserByCustomerId(object.customer, { + stripeSubscriptionStatus: "past_due", + }); + + break; + + case "customer.subscription.updated": + await updateUserByCustomerId(object.customer, { + stripePriceId: object.items.data[0].price.id, + stripeSubscriptionStatus: object.status, + }); + + // 💡 You could also read "cancel_at_period_end" if you'd like to email user and learn why they cancelled + // or convince them to renew before their subscription is deleted at end of payment period. + break; + + case "customer.subscription.deleted": + // If a subscription was deleted update stored subscription status to "canceled". + // Keep in mind this won't be called right away if "Cancel at end of billing period" is selected + // in Billing Portal settings (https://dashboard.stripe.com/settings/billing/portal). Instead you'll + // get a "customer.subscription.updated" event with a cancel_at_period_end value. + await updateUserByCustomerId(object.customer, { + stripeSubscriptionStatus: "canceled", + }); + + break; + + case "customer.subscription.trial_will_end": + // This event happens 3 days before a trial ends + // 💡 You could email user letting them know their trial will end or you can have Stripe do that + // automatically 7 days in advance: https://dashboard.stripe.com/settings/billing/automatic + + break; + + // no default + } + + // Send success response + res.send({ status: "success" }); + } catch (error) { + console.log("stripe webhook error", error); + + // Send error response + res.send({ status: "error", code: error.code, message: error.message }); + } +}; diff --git a/dist/fonts/Recoleta-Bold.ttf b/dist/fonts/Recoleta-Bold.ttf deleted file mode 100644 index 6a28fa6293c279ceca29e36c20223d67e9940785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125660 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 B$F%?e diff --git a/dist/fonts/Recoleta-Regular.ttf b/dist/fonts/Recoleta-Regular.ttf deleted file mode 100644 index 7c87a1be90641d13cff9108af6ea588120dafbf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125392 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 diff --git a/divjoy-project.json b/divjoy-project.json new file mode 100644 index 0000000..2684be0 --- /dev/null +++ b/divjoy-project.json @@ -0,0 +1,8728 @@ +{ + "data": [ + { + "type": "instance", + "subtype": "app-instance", + "componentId": "app", + "id": 4012090, + "isVisible": true, + "children": [] + } + ], + "components": [ + { + "type": "component", + "name": "PageLoader", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 4770710, + "attributes": "{\n\tbg: \"white\",\n className: \"d-flex justify-content-center align-items-center\",\n style: { \n height: \"400px\",\n ...style\n },\n ...otherProps,\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 4876683, + "attributes": "{\n\tanimation: \"border\",\n variant: \"primary\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "variant", + "value": "primary", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "className", + "value": "d-flex justify-content-center align-items-center", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "style", + "value": "{ \n height: \"400px\",\n ...style\n}", + "isString": false, + "type": "ObjectExpression" + }, + { + "key": null, + "value": "otherProps", + "isString": false, + "type": "SpreadElement" + } + ] + } + ], + "tags": [ + "Hero", + "Popular" + ], + "id": 4298867, + "code": "\tconst { style, ...otherProps } = props;\n", + "isVisible": true, + "nameLibrary": "", + "description": "", + "nameFormatted": "PageLoader", + "nameStyleModule": "PageLoader", + "modulePath": "src/components/PageLoader" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Spinner", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Spinner", + "default": "Spinner" + }, + "id": 146872, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Spinner", + "nameStyleModule": "Spinner", + "modulePath": "react-bootstrap/Spinner" + }, + { + "type": "component", + "name": "Background Image", + "id": 1986700, + "children": [ + { + "type": "element", + "tagName": "div", + "attributes": "{\n style: {\n '--image': `url(${props.image})`,\n '--opacity': props.opacity\n }\n}", + "style": "// Set using CSS vars defined\n// in element inline style.\nbackground-image: var(--image);\nopacity: var(--opacity);\n// Fill parent container\nbackground-position: center center;\nbackground-size: cover;\ntop: 0;\nleft: 0;\nbottom: 0;\nright: 0;\nposition: absolute;\n// Place under other elements\nz-index: 0;\n\n// Make it a repeating pattern\n&.repeat {\n background-size: auto;\n background-position: 0% 0%;\n background-repeat: true;\n}", + "id": 3881161, + "classNameExpressions": [ + { + "js": "props.repeat", + "classNames": [ + "repeat" + ] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "children": [], + "propsArray": [ + { + "key": "style", + "value": "{\n '--image': `url(${props.image})`,\n '--opacity': props.opacity\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "BackgroundImage", + "nameStyleModule": "BackgroundImage", + "modulePath": "src/components/BackgroundImage" + }, + { + "type": "component", + "name": "Section", + "children": [ + { + "type": "element", + "tagName": "section", + "id": 6386747, + "attributes": "{\n\t...otherProps\n}", + "classNames": [ + "py-5", + "position-relative" + ], + "classNameExpressions": [ + { + "js": "props.bg", + "classNames": [ + "bg-{props.bg}" + ] + }, + { + "js": "props.textColor", + "classNames": [ + "text-{props.textColor}" + ] + }, + { + "js": "className", + "classNames": [ + "{className}" + ] + } + ], + "style": "// Ensure container is above bgImage\n.container {\n position: relative;\n}\n\n// Add light border if two white\n// sections next to each other.\n.bg-white + &.bg-white {\n border-top: 1px solid #F0F0F0;\n}", + "children": [ + { + "type": "if", + "js": "bgImage", + "id": 5756517, + "children": [ + { + "type": "instance", + "componentId": 1986700, + "attributes": "{\n\timage: bgImage,\n opacity: bgImageOpacity,\n repeat: bgImageRepeat\n}", + "id": 4826940, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "image", + "value": "bgImage", + "isString": false, + "type": "Identifier" + }, + { + "key": "opacity", + "value": "bgImageOpacity", + "isString": false, + "type": "Identifier" + }, + { + "key": "repeat", + "value": "bgImageRepeat", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "isVisible": true + }, + { + "type": "element", + "tagName": "div", + "id": 9929135, + "children": [ + { + "type": "children", + "id": 7508953, + "isVisible": true, + "children": [] + } + ], + "classNameExpressions": [ + { + "js": "[\"md\", \"lg\"].includes(props.size)", + "classNames": [ + "py-md-5" + ] + }, + { + "js": "props.size === \"lg\"", + "classNames": [ + "my-md-5" + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "image": "", + "name": "", + "propsArray": [ + { + "key": null, + "value": "otherProps", + "isString": false, + "type": "SpreadElement" + } + ] + } + ], + "id": 1219852, + "code": "\tconst {\n bg, \n textColor, \n bgImage,\n bgImageOpacity,\n bgImageRepeat,\n className,\n children,\n ...otherProps \n } = props;\n", + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "Section", + "nameStyleModule": "SectionComponent", + "modulePath": "src/components/Section" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Nav", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Nav", + "default": "Nav" + }, + "id": 8654202, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Nav", + "nameStyleModule": "Nav", + "modulePath": "react-bootstrap/Nav" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Nav.Item", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Nav", + "default": "Nav" + }, + "id": 3874764, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Nav.Item", + "nameStyleModule": "Nav.Item", + "modulePath": "react-bootstrap/Nav" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Nav.Link", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Nav", + "default": "Nav" + }, + "id": 2031462, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Nav.Link", + "nameStyleModule": "Nav.Link", + "modulePath": "react-bootstrap/Nav" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Navbar", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Navbar", + "default": "Navbar" + }, + "id": 5692101, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Navbar", + "nameStyleModule": "NavbarComponent", + "modulePath": "react-bootstrap/Navbar" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Navbar.Brand", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Navbar", + "default": "Navbar" + }, + "id": 3474382, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Navbar.Brand", + "nameStyleModule": "Navbar.Brand", + "modulePath": "react-bootstrap/Navbar" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Navbar.Toggle", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Navbar", + "default": "Navbar" + }, + "id": 7703235, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Navbar.Toggle", + "nameStyleModule": "Navbar.Toggle", + "modulePath": "react-bootstrap/Navbar" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Navbar.Collapse", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Navbar", + "default": "Navbar" + }, + "id": 1064541, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Navbar.Collapse", + "nameStyleModule": "Navbar.Collapse", + "modulePath": "react-bootstrap/Navbar" + }, + { + "type": "component", + "name": "Navbar Custom", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 5692101, + "id": 338351, + "attributes": "{\n\tbg: props.bg,\n variant: props.variant,\n expand: props.expand\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 9459815, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 3474382, + "id": 7235789, + "attributes": "{\n\thref: \"/\"\n}", + "children": [ + { + "type": "element", + "tagName": "img", + "attributes": "{\n src: props.logo,\n alt: \"Logo\",\n height: \"30\"\n}", + "classNames": [ + "d-inline-block", + "align-top" + ], + "id": 2786374, + "isVisible": true, + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "children": [], + "propsArray": [ + { + "key": "src", + "value": "props.logo", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "alt", + "value": "Logo", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "height", + "value": "30", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "href", + "value": "/", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7703235, + "id": 5141367, + "attributes": "{\n\t'aria-controls': \"navbar-nav\",\n className: \"border-0\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "aria-controls", + "value": "navbar-nav", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "className", + "value": "border-0", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 1064541, + "id": 6146537, + "attributes": "{\n\tid: \"navbar-nav\",\n className: \"justify-content-end\"\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 8654202, + "id": 855664, + "children": [ + { + "type": "if", + "js": "auth.user", + "id": 9355357, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 3538237, + "id": 5829386, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7393532, + "id": 4904643, + "children": [ + { + "type": "text", + "text": "Dashboard", + "id": 2496932, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\thref: \"/dashboard\",\n active: false\n}", + "isVisible": true, + "propsArray": [ + { + "key": "href", + "value": "/dashboard", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "active", + "value": "false", + "isString": false, + "type": "BooleanLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7393532, + "id": 4622855, + "children": [ + { + "type": "text", + "text": "Settings", + "id": 3020012, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\thref: \"/settings/general\",\n active: false\n}", + "isVisible": true, + "propsArray": [ + { + "key": "href", + "value": "/settings/general", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "active", + "value": "false", + "isString": false, + "type": "BooleanLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7194631, + "id": 3959982, + "isVisible": true, + "attributes": "{\n\n}", + "children": [], + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7393532, + "id": 928413, + "children": [ + { + "type": "text", + "text": "Sign out", + "id": 7858069, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n href: \"/auth/signout\",\n active: false,\n onClick: (e) => {\n e.preventDefault();\n auth.signout();\n }\n}", + "isVisible": true, + "propsArray": [ + { + "key": "href", + "value": "/auth/signout", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "active", + "value": "false", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "onClick", + "value": "(e) => {\n e.preventDefault();\n auth.signout();\n}", + "isString": false, + "type": "ArrowFunctionExpression" + } + ] + } + ], + "attributes": "{\n id: \"dropdown\",\n\ttitle: \"Account\",\n alignRight: true\n}", + "isVisible": true, + "propsArray": [ + { + "key": "id", + "value": "dropdown", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "title", + "value": "Account", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "alignRight", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "!auth.user", + "id": 2748018, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 3874764, + "id": 5363630, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2031462, + "id": 3103546, + "children": [ + { + "type": "text", + "text": "Sign in", + "id": 2693983, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\thref: \"/auth/signin\",\n active: false\n}", + "isVisible": true, + "propsArray": [ + { + "key": "href", + "value": "/auth/signin", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "active", + "value": "false", + "isString": false, + "type": "BooleanLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "id", + "value": "navbar-nav", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "className", + "value": "justify-content-end", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "variant", + "value": "props.variant", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "expand", + "value": "props.expand", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 7907106, + "tags": [ + "Navigation" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "NavbarCustom", + "nameStyleModule": "NavbarCustom", + "modulePath": "src/components/NavbarCustom" + }, + { + "type": "component", + "subtype": "external-component", + "name": "NavDropdown.Item", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/NavDropdown", + "default": "NavDropdown" + }, + "id": 7393532, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "NavDropdown.Item", + "nameStyleModule": "NavDropdown.Item", + "modulePath": "react-bootstrap/NavDropdown" + }, + { + "type": "component", + "subtype": "external-component", + "name": "NavDropdown", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/NavDropdown", + "default": "NavDropdown" + }, + "id": 3538237, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "NavDropdown", + "nameStyleModule": "NavDropdown", + "modulePath": "react-bootstrap/NavDropdown" + }, + { + "type": "component", + "subtype": "page-component", + "children": [ + { + "type": "instance", + "componentId": 1952882, + "id": 7698388, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n\t// Text content\n title: \"Your landing page title here\",\n subtitle: \"This landing page is perfect for showing off your awesome product and driving people to sign up for a paid plan.\",\n buttonText: \"Get Started\",\n // primary, secondary, success, danger,\n // warning, info, light, dark, link\n buttonColor: \"primary\",\n // Image on right\n image: 'https://uploads.divjoy.com/undraw-japan_ubgk.svg',\n // Button onClick handler\n buttonOnClick: () => {\n // Navigate to pricing page\n router.push('/pricing');\n }\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Your landing page title here", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "This landing page is perfect for showing off your awesome product and driving people to sign up for a paid plan.", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonText", + "value": "Get Started", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonColor", + "value": "primary", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "image", + "value": "https://uploads.divjoy.com/undraw-japan_ubgk.svg", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonOnClick", + "value": "() => {\n // Navigate to pricing page\n router.push('/pricing');\n}", + "isString": false, + "type": "ArrowFunctionExpression" + } + ] + }, + { + "type": "instance", + "componentId": 2115492, + "id": 4167612, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n\t// Text content\n title: \"Features\",\n subtitle: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Features", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 446637, + "id": 8068392, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"light\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n // Text content\n title: \"Here's what people are saying\",\n subtitle: \"\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "light", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Here's what people are saying", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 6266495, + "id": 6069326, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n\t// Text content\n title: \"Stay in the know\",\n subtitle: \"Receive our latest articles and feature updates\",\n buttonText: \"Subscribe\",\n // primary, secondary, success, danger,\n // warning, info, light, dark, link\n buttonColor: \"primary\",\n inputPlaceholder: \"Enter your email\",\n subscribedMessage: \"You are now subscribed!\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Stay in the know", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "Receive our latest articles and feature updates", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonText", + "value": "Subscribe", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonColor", + "value": "primary", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "inputPlaceholder", + "value": "Enter your email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subscribedMessage", + "value": "You are now subscribed!", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 8064060, + "isVisible": true, + "code": "", + "path": "", + "description": "", + "requireAuth": false, + "nameFormatted": "IndexPage", + "nameStyleModule": "IndexPage", + "modulePath": "src/pages/index" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Button", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Button", + "default": "Button" + }, + "id": 7042691, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Button", + "nameStyleModule": "ButtonComponent", + "modulePath": "react-bootstrap/Button" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Container", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Container", + "default": "Container" + }, + "id": 2178390, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Container", + "nameStyleModule": "ContainerComponent", + "modulePath": "react-bootstrap/Container" + }, + { + "type": "component", + "name": "Section Header", + "children": [ + { + "type": "element", + "tagName": "header", + "id": 4892904, + "classNameExpressions": [ + { + "js": "props.className", + "classNames": [ + "{props.className}" + ] + } + ], + "style": "// Add bottom margin if element below\n&:not(:last-child){\n\tmargin-bottom: 2rem;\n}", + "children": [ + { + "type": "if", + "js": "props.title", + "id": 3051339, + "children": [ + { + "type": "element", + "tagName": "h1", + "children": [ + { + "type": "text", + "text": "{props.title}", + "id": 3096491, + "isVisible": true, + "children": [] + } + ], + "id": 68747, + "classNames": [ + "font-weight-bold" + ], + "classNameExpressions": [ + { + "js": "props.subtitle && props.spaced", + "classNames": [ + "mb-4" + ] + }, + { + "js": "!props.subtitle", + "classNames": [ + "mb-0" + ] + }, + { + "js": "props.size", + "classNames": [ + "h{props.size}" + ] + } + ], + "name": "Title", + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "style": "", + "propsArray": [] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "props.subtitle", + "id": 7021426, + "children": [ + { + "type": "element", + "tagName": "p", + "id": 9013236, + "children": [ + { + "type": "text", + "text": "{props.subtitle}", + "id": 1531402, + "isVisible": true, + "children": [] + } + ], + "name": "Subtitle", + "style": "// Subtitle text generally isn't very long\n// so usually looks better to limit width.\nmax-width: 700px;\n// So we can have max-width but still\n// have alignment controlled by text-align.\ndisplay: inline-block;", + "classNames": [ + "mb-0" + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "classNameExpressions": [], + "propsArray": [] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "propsArray": [] + } + ], + "id": 5118913, + "code": "\t// Render nothing if no title or subtitle\n\tif (!props.title && !props.subtitle){\n return null;\n }\n", + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "SectionHeader", + "nameStyleModule": "SectionHeader", + "modulePath": "src/components/SectionHeader" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Row", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Row", + "default": "Row" + }, + "id": 9541476, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Row", + "nameStyleModule": "Row", + "modulePath": "react-bootstrap/Row" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Col", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Col", + "default": "Col" + }, + "id": 9152506, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Col", + "nameStyleModule": "Col", + "modulePath": "react-bootstrap/Col" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Image", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Image", + "default": "Image" + }, + "id": 4825682, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Image", + "nameStyleModule": "ImageComponent", + "modulePath": "react-bootstrap/Image" + }, + { + "type": "component", + "name": "Hero Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 355828, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 2596949, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9541476, + "id": 8109281, + "attributes": "{\n\tclassName: \"align-items-center\"\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 6521773, + "attributes": "{\n\tlg: 5,\n className: \"text-center text-lg-left\"\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 1167457, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 1,\n // Space between title/subtitle\n spaced: true\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 6289408, + "attributes": "{\n // primary, secondary, success, danger,\n // warning, info, light, dark, link\n\tvariant: props.buttonColor,\n // sm, md, lg\n size: \"lg\",\n onClick: props.buttonOnClick\n}", + "children": [ + { + "type": "text", + "text": "{props.buttonText}", + "id": 858525, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "props.buttonColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "lg", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "onClick", + "value": "props.buttonOnClick", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "lg", + "value": "5", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "className", + "value": "text-center text-lg-left", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 3014917, + "attributes": "{\n\tclassName: \"offset-lg-1 mt-5 mt-lg-0 \"\n}\t", + "children": [ + { + "type": "element", + "tagName": "figure", + "id": 2537181, + "classNames": [ + "mx-auto" + ], + "style": "max-width: 570px;", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4825682, + "id": 9836541, + "attributes": "{\n\tsrc: props.image,\n fluid: true\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "src", + "value": "props.image", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "fluid", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + } + ] + } + ], + "name": "Image Container", + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "classNameExpressions": [], + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "offset-lg-1 mt-5 mt-lg-0 ", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "align-items-center", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 1952882, + "tags": [ + "Hero", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "HeroSection", + "nameStyleModule": "HeroSection", + "modulePath": "src/components/HeroSection" + }, + { + "type": "component", + "name": "Features Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 4987131, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 5113959, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 8724146, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 52179, + "attributes": "{\n items: [\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-mind_map_cwng.svg\"\n },\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-personal_settings_kihd.svg\"\n },\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-having_fun_iais.svg\"\n },\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-balloons_vxx5.svg\"\n }\n ]\n}", + "id": 3817850, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "items", + "value": "[\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-mind_map_cwng.svg\"\n },\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-personal_settings_kihd.svg\"\n },\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-having_fun_iais.svg\"\n },\n {\n title: \"Explore\",\n description: \"Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.\",\n image: \"https://uploads.divjoy.com/undraw-balloons_vxx5.svg\"\n }\n]", + "isString": false, + "type": "ArrayExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 2115492, + "tags": [ + "Features", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "FeaturesSection", + "nameStyleModule": "FeaturesSection", + "modulePath": "src/components/FeaturesSection" + }, + { + "type": "component", + "name": "Features", + "children": [ + { + "type": "element", + "tagName": "div", + "id": 9628149, + "style": "max-width: 900px;\nmargin: 60px auto 0 auto;\n\n.row {\n // Reverse every other row\n\t&:nth-of-type(even) {\n \tflex-direction: row-reverse;\n\t}\n\n\t&:not(:last-of-type) {\n \tpadding-bottom: 1.5rem;\n \t@media screen and (min-width: 769px) {\n \tpadding-bottom: 2.5rem;\n \t}\n\t}\n}", + "children": [ + { + "type": "foreach", + "valName": "item", + "indexName": "index", + "objectName": "props.items", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9541476, + "id": 6281647, + "attributes": "{\n\tclassName: \"align-items-center\",\n key: index\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 9301972, + "attributes": "{\n xs: 12,\n lg: 6\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 9952121, + "attributes": "{\n\ttitle: item.title,\n subtitle: item.description,\n // Space between title/subtitle\n spaced: true,\n // Text size (1-5)\n size: 3,\n className: \"text-center text-lg-left\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "item.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "item.description", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "size", + "value": "3", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "className", + "value": "text-center text-lg-left", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "lg", + "value": "6", + "isString": false, + "type": "NumericLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 9254091, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "element", + "tagName": "figure", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4825682, + "id": 5275487, + "attributes": "{\n\tsrc: item.image,\n alt: item.title,\n fluid: true\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "src", + "value": "item.image", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "alt", + "value": "item.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "fluid", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + } + ] + } + ], + "id": 7534256, + "style": "max-width: 300px;\nmargin: 30px auto;", + "name": "Image Container", + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "classNames": [], + "classNameExpressions": [], + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "align-items-center", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "key", + "value": "index", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "id": 2588807, + "isVisible": true, + "objectType": "array" + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "propsArray": [] + } + ], + "id": 52179, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "Features", + "nameStyleModule": "Features", + "modulePath": "src/components/Features" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Card", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Card", + "default": "Card" + }, + "id": 1026782, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Card", + "nameStyleModule": "CardComponent", + "modulePath": "react-bootstrap/Card" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Card.Body", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Card", + "default": "Card" + }, + "id": 107678, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Card.Body", + "nameStyleModule": "Card.Body", + "modulePath": "react-bootstrap/Card" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Card.Text", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Card", + "default": "Card" + }, + "id": 2294156, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Card.Text", + "nameStyleModule": "Card.Text", + "modulePath": "react-bootstrap/Card" + }, + { + "type": "component", + "id": 1643087, + "name": "Avatar", + "code": "\tconst { size, ...otherProps } = props;\n", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4825682, + "id": 2459106, + "attributes": "{\n\t...otherProps,\n roundedCircle: true,\n style: {\n width: size,\n height: size\n }\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": null, + "value": "otherProps", + "isString": false, + "type": "SpreadElement" + }, + { + "key": "roundedCircle", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "style", + "value": "{\n width: size,\n height: size\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "Avatar", + "nameStyleModule": "Avatar", + "modulePath": "src/components/Avatar" + }, + { + "type": "component", + "name": "Testimonials Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 8530134, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 2765556, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 6821353, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 30962661, + "attributes": "{\n items: [\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-5.jpeg',\n name: 'Sarah Kline',\n testimonial: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.',\n company: \"Company\"\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-48.jpeg',\n name: 'Shawna Murray',\n testimonial: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam!',\n company: \"Company\"\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-12.jpeg',\n name: 'Blake Elder',\n testimonial: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae.',\n company: \"Company\"\n }\n ]\n}", + "id": 9883719, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "items", + "value": "[\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-5.jpeg',\n name: 'Sarah Kline',\n testimonial: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.',\n company: \"Company\"\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-48.jpeg',\n name: 'Shawna Murray',\n testimonial: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam!',\n company: \"Company\"\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-12.jpeg',\n name: 'Blake Elder',\n testimonial: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae.',\n company: \"Company\"\n }\n]", + "isString": false, + "type": "ArrayExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 446637, + "tags": [ + "Testimonials", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "TestimonialsSection", + "nameStyleModule": "TestimonialsSection", + "modulePath": "src/components/TestimonialsSection" + }, + { + "type": "component", + "name": "Testimonials", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9541476, + "id": 3254149, + "attributes": "{\n\tclassName: \"justify-content-center\"\n}\t", + "children": [ + { + "type": "foreach", + "valName": "item", + "objectName": "props.items", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 658919, + "attributes": "{\n\txs: 12,\n md: 4,\n className: \"py-3\",\n key: index\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 1026782, + "id": 1702757, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 107678, + "id": 9756377, + "children": [ + { + "type": "instance", + "componentId": 1643087, + "id": 5412947, + "attributes": "{\n\tsrc: item.avatar,\n alt: item.name,\n size: \"96px\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "src", + "value": "item.avatar", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "alt", + "value": "item.name", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "96px", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2294156, + "id": 2878266, + "children": [ + { + "type": "text", + "text": "\"{item.testimonial}\"", + "id": 2552066, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\tclassName: \"mt-4\"\n}", + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "mt-4", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "h6", + "children": [ + { + "type": "text", + "text": "{item.name}", + "id": 4407839, + "isVisible": true, + "children": [] + } + ], + "id": 406921, + "classNames": [ + "font-weight-bold", + "mb-0", + "mt-4" + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "element", + "tagName": "small", + "id": 3163072, + "children": [ + { + "type": "text", + "text": "{item.company}", + "id": 1247575, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "attributes": "{\n\tclassName: \"p-4 text-center\"\n}", + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "p-4 text-center", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "md", + "value": "4", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "className", + "value": "py-3", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "key", + "value": "index", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "id": 3674900, + "indexName": "index", + "isVisible": true, + "objectType": "array" + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "justify-content-center", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 30962661, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "Testimonials", + "nameStyleModule": "Testimonials", + "modulePath": "src/components/Testimonials" + }, + { + "type": "component", + "name": "Newsletter Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 9523549, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 1340445, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9541476, + "id": 4893986, + "attributes": "{\n\tclassName: \"justify-content-center align-items-center\"\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 7070069, + "attributes": "{\n\txs: 12,\n lg: 6\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 1354607, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: false\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "false", + "isString": false, + "type": "BooleanLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "lg", + "value": "6", + "isString": false, + "type": "NumericLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 8873577, + "attributes": "{\n\txs: 12,\n lg: 6,\n className: \"mt-4 mt-lg-0\"\n}\t", + "children": [ + { + "type": "instance", + "componentId": 4938296, + "id": 9435554, + "attributes": "{\n parentColor: props.color,\n\tbuttonText: props.buttonText,\n inputPlaceholder: props.inputPlaceholder,\n subscribedMessage: props.subscribedMessage,\n\t// sm, md, lg\n size: \"lg\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "parentColor", + "value": "props.color", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "buttonText", + "value": "props.buttonText", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputPlaceholder", + "value": "props.inputPlaceholder", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subscribedMessage", + "value": "props.subscribedMessage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "lg", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "lg", + "value": "6", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "className", + "value": "mt-4 mt-lg-0", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "justify-content-center align-items-center", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 6266495, + "tags": [ + "Newsletter", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "NewsletterSection", + "nameStyleModule": "NewsletterSection", + "modulePath": "src/components/NewsletterSection" + }, + { + "type": "component", + "name": "Newsletter", + "children": [ + { + "type": "if", + "js": "subscribed === false", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2030395, + "id": 1680148, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 1627034, + "id": 793996, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 9986916, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 4427680, + "attributes": "{\n size: props.size,\n name: 'email',\n type: 'email',\n placeholder: 'Email',\n\terror: errors.email,\n inputRef: register({ \n required: \"Please enter an email address\" \n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.email", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter an email address\" \n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 3714430, + "attributes": "{\n\txs: \"auto\"\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 4768041, + "attributes": "{\n\tvariant: props.buttonColor,\n size: props.size,\n type: \"submit\"\n}", + "children": [ + { + "type": "text", + "text": "{props.buttonText}", + "id": 1973789, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "props.buttonColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "type", + "value": "submit", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "xs", + "value": "auto", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "attributes": "{\n onSubmit: handleSubmit(onSubmit)\n}", + "isVisible": true, + "propsArray": [ + { + "key": "onSubmit", + "value": "handleSubmit(onSubmit)", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "id": 6823959, + "isVisible": true + }, + { + "type": "if", + "js": "subscribed === true", + "children": [ + { + "type": "element", + "tagName": "div", + "id": 8587611, + "children": [ + { + "type": "text", + "text": "{props.subscribedMessage}", + "id": 2275463, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "id": 6260414, + "isVisible": true + } + ], + "id": 4938296, + "code": "\tconst [subscribed, setSubscribed] = useState(false);\n\tconst { handleSubmit, register, errors } = useForm();\n\n\tconst onSubmit = ({ email }) => {\n setSubscribed(true);\n // Parent component can optionally\n // find out when subscribed.\n props.onSubscribed && props.onSubscribed();\n // Subscribe them\n newsletter.subscribe({ email });\n }\n ", + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "Newsletter", + "nameStyleModule": "Newsletter", + "modulePath": "src/components/Newsletter" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Form.Row", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Form", + "default": "Form" + }, + "id": 1627034, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Form.Row", + "nameStyleModule": "Form.Row", + "modulePath": "react-bootstrap/Form" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Form.Control", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Form", + "default": "Form" + }, + "id": 4995668, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Form.Control", + "nameStyleModule": "Form.Control", + "modulePath": "react-bootstrap/Form" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Form", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Form", + "default": "Form" + }, + "id": 2030395, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Form", + "nameStyleModule": "Form", + "modulePath": "react-bootstrap/Form" + }, + { + "type": "component", + "id": 4644163, + "name": "Footer", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 5496536, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity,\n className: \"footer\"\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 2857930, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "element", + "tagName": "div", + "children": [ + { + "type": "element", + "tagName": "div", + "classNames": [ + "brand", + "left" + ], + "children": [ + { + "type": "element", + "tagName": "a", + "attributes": "{\n href: '/' \n}", + "children": [ + { + "type": "element", + "tagName": "img", + "attributes": "{\n src: props.logo,\n alt: \"Logo\"\n}", + "id": 4140551, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "children": [], + "propsArray": [ + { + "key": "src", + "value": "props.logo", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "alt", + "value": "Logo", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 4960806, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 4694183, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "element", + "tagName": "div", + "classNames": [ + "links", + "right" + ], + "children": [ + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "text", + "text": "About", + "id": 9452607, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\thref: '/about'\n}", + "id": 1879924, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/about", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "text", + "text": "FAQ", + "id": 3244183, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\thref: '/faq',\n}", + "id": 6446098, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/faq", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "text", + "text": "Contact", + "id": 1956482, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\thref: '/contact',\n}", + "id": 2565120, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/contact", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "text", + "text": "Blog", + "id": 4544242, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n target: \"_blank\",\n href: \"https://medium.com\",\n rel: \"noopener noreferrer\"\n}", + "id": 9988760, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "target", + "value": "_blank", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "href", + "value": "https://medium.com", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "rel", + "value": "noopener noreferrer", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 8371540, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "element", + "tagName": "div", + "classNames": [ + "social", + "right" + ], + "children": [ + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "element", + "tagName": "span", + "classNames": [ + "icon" + ], + "children": [ + { + "type": "element", + "tagName": "i", + "classNames": [ + "fab", + "fa-twitter" + ], + "id": 7564851, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "children": [], + "propsArray": [] + } + ], + "id": 8415390, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "attributes": "{\n\thref: 'https://twitter.com',\n\ttarget: '_blank',\n rel: 'noopener noreferrer'\n}", + "id": 6363101, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "https://twitter.com", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "target", + "value": "_blank", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "rel", + "value": "noopener noreferrer", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "element", + "tagName": "span", + "classNames": [ + "icon" + ], + "children": [ + { + "type": "element", + "tagName": "i", + "classNames": [ + "fab", + "fa-facebook-f" + ], + "id": 9154533, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "children": [], + "propsArray": [] + } + ], + "id": 7244421, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "attributes": "{\n\thref: 'https://facebook.com',\n\ttarget: '_blank',\n rel: 'noopener noreferrer'\n}", + "id": 6436254, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "https://facebook.com", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "target", + "value": "_blank", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "rel", + "value": "noopener noreferrer", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "element", + "tagName": "span", + "classNames": [ + "icon" + ], + "children": [ + { + "type": "element", + "tagName": "i", + "classNames": [ + "fab", + "fa-instagram" + ], + "id": 8307317, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "children": [], + "propsArray": [] + } + ], + "id": 3045136, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "attributes": "{\n\thref: 'https://instagram.com',\n\ttarget: '_blank',\n rel: 'noopener noreferrer'\n}", + "id": 7874949, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "https://instagram.com", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "target", + "value": "_blank", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "rel", + "value": "noopener noreferrer", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 3810280, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "element", + "tagName": "div", + "classNames": [ + "copyright", + "left" + ], + "children": [ + { + "type": "text", + "text": "{props.copyright}", + "id": 296486, + "isVisible": true, + "children": [] + } + ], + "id": 1476061, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "style": "display: flex;\nflex-wrap: wrap;\n> div {\n display: flex;\n flex: none;\n justify-content: center;\n width: 100%;\n margin-bottom: 24px;\n}\n\n.brand {\n img {\n display: block;\n height: 32px;\n }\n}\n\n.social {\n align-items: flex-end;\n}\n\n.social, .links {\n a {\n color: inherit;\n &:hover {\n opacity: 0.8;\n }\n\n &:not(:first-of-type) {\n margin-left: 20px;\n }\n }\n}\n\n// Tablet and up\n@media screen and (min-width: 768px) {\n > div {\n flex: 50%;\n }\n\n .left {\n justify-content: flex-start;\n }\n\n .right {\n justify-content: flex-end;\n }\n \n // Move links to end (bottom right)\n // Swaps position with social\n .links {\n order: 1;\n }\n}", + "id": 9137580, + "name": "Inner", + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "classNames": [], + "classNameExpressions": [], + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "className", + "value": "footer", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "tags": [ + "Footer", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "Footer", + "nameStyleModule": "FooterComponent", + "modulePath": "src/components/Footer" + }, + { + "type": "component", + "subtype": "page-component", + "path": "about", + "id": 6317044, + "children": [ + { + "type": "instance", + "componentId": 4704983, + "id": 5654207, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"primary\",\n textColor: \"white\",\n // sm, md, lg\n size: \"lg\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n // Text content\n title: \"We help you make money\",\n subtitle: \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam!\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "primary", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "lg", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "We help you make money", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam!", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 7166127, + "id": 3949584, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n // Text content\n title: \"Meet the Team\",\n subtitle: \"\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Meet the Team", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "code": "", + "description": "", + "requireAuth": false, + "nameFormatted": "AboutPage", + "nameStyleModule": "AboutPage", + "modulePath": "src/pages/about" + }, + { + "type": "component", + "name": "Hero Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 9341732, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 9099908, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 5157241, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 1,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 4704983, + "tags": [ + "Hero", + "Content" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "HeroSection2", + "nameStyleModule": "HeroSection2", + "modulePath": "src/components/HeroSection2" + }, + { + "type": "component", + "name": "Team Bios Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 900919, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 3852613, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 7343985, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 8455069, + "attributes": "{\n items: [\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-68.jpeg',\n name: 'John Smith',\n role: 'Software Engineer',\n bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo.',\n twitterUrl: 'https://twitter.com',\n facebookUrl: 'https://facebook.com',\n linkedinUrl: 'https://linkedin.com'\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-35.jpeg',\n name: 'Lisa Zinn',\n role: 'Software Engineer',\n bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam! Labore reprehenderit beatae magnam animi!',\n twitterUrl: 'https://twitter.com',\n facebookUrl: 'https://facebook.com',\n linkedinUrl: 'https://linkedin.com'\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-16.jpeg',\n name: 'Diana Low',\n role: 'Designer',\n bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam! Labore reprehenderit beatae magnam animi!',\n twitterUrl: 'https://twitter.com',\n facebookUrl: 'https://facebook.com',\n linkedinUrl: 'https://linkedin.com'\n }\n ]\n}", + "id": 816322, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "items", + "value": "[\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-68.jpeg',\n name: 'John Smith',\n role: 'Software Engineer',\n bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo.',\n twitterUrl: 'https://twitter.com',\n facebookUrl: 'https://facebook.com',\n linkedinUrl: 'https://linkedin.com'\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-35.jpeg',\n name: 'Lisa Zinn',\n role: 'Software Engineer',\n bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam! Labore reprehenderit beatae magnam animi!',\n twitterUrl: 'https://twitter.com',\n facebookUrl: 'https://facebook.com',\n linkedinUrl: 'https://linkedin.com'\n },\n {\n avatar: 'https://uploads.divjoy.com/pravatar-150x-16.jpeg',\n name: 'Diana Low',\n role: 'Designer',\n bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam! Labore reprehenderit beatae magnam animi!',\n twitterUrl: 'https://twitter.com',\n facebookUrl: 'https://facebook.com',\n linkedinUrl: 'https://linkedin.com'\n }\n]", + "isString": false, + "type": "ArrayExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 7166127, + "tags": [ + "Team", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "TeamBiosSection", + "nameStyleModule": "TeamBiosSection", + "modulePath": "src/components/TeamBiosSection" + }, + { + "type": "component", + "name": "Team Bios", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9541476, + "id": 3906305, + "attributes": "{\n\tclassName: \"justify-content-center\"\n}\t", + "children": [ + { + "type": "foreach", + "valName": "item", + "objectName": "props.items", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 6085506, + "attributes": "{\n\txs: 12,\n md: 6,\n lg: 4,\n className: \"py-3 d-flex align-items-stretch\",\n key: index\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 1026782, + "id": 4000604, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 107678, + "id": 6677188, + "children": [ + { + "type": "instance", + "componentId": 1643087, + "id": 3768480, + "attributes": "{\n\tsrc: item.avatar,\n alt: item.name,\n size: \"128px\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "src", + "value": "item.avatar", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "alt", + "value": "item.name", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "128px", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "h6", + "children": [ + { + "type": "text", + "text": "{item.name}", + "id": 7946748, + "isVisible": true, + "children": [] + } + ], + "id": 3945714, + "classNames": [ + "font-weight-bold", + "mb-0", + "mt-4" + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "element", + "tagName": "small", + "id": 9457314, + "children": [ + { + "type": "text", + "text": "{item.role}", + "id": 219114, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2294156, + "id": 1068165, + "children": [ + { + "type": "text", + "text": "{item.bio}", + "id": 760144, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\tclassName: \"mt-4\"\n}", + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "mt-4", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "attributes": "{\n\tclassName: \"d-flex flex-column text-center align-items-center p-4\"\n}", + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "d-flex flex-column text-center align-items-center p-4", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "attributes": "{\n\t\n}", + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "md", + "value": "6", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "lg", + "value": "4", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "className", + "value": "py-3 d-flex align-items-stretch", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "key", + "value": "index", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "id": 8318009, + "indexName": "index", + "isVisible": true, + "objectType": "array" + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "justify-content-center", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 8455069, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "TeamBios", + "nameStyleModule": "TeamBios", + "modulePath": "src/components/TeamBios" + }, + { + "type": "component", + "subtype": "page-component", + "path": "faq", + "id": 4387217, + "children": [ + { + "type": "instance", + "componentId": 3246815, + "id": 9983473, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n\t// Text content\n title: \"Frequently Asked Questions\",\n subtitle: \"\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Frequently Asked Questions", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "code": "", + "description": "", + "requireAuth": false, + "nameFormatted": "FaqPage", + "nameStyleModule": "FaqPage", + "modulePath": "src/pages/faq" + }, + { + "type": "component", + "name": "FAQ", + "id": 8283571, + "children": [ + { + "type": "foreach", + "valName": "item", + "objectName": "props.items", + "children": [ + { + "type": "instance", + "componentId": 4138632, + "attributes": "{\n\tquestion: item.question,\n answer: item.answer,\n key: index\n}", + "id": 4654073, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "question", + "value": "item.question", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "answer", + "value": "item.answer", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "key", + "value": "index", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "id": 4326310, + "indexName": "index", + "isVisible": true, + "objectType": "array" + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "Faq", + "nameStyleModule": "Faq", + "modulePath": "src/components/Faq" + }, + { + "type": "component", + "name": "FAQ Item", + "code": "\tconst [expanded, setExpanded] = useState(false);\t\n", + "id": 4138632, + "children": [ + { + "type": "element", + "tagName": "article", + "attributes": "{\n\tonClick: () => setExpanded(!expanded)\n}", + "style": "cursor: pointer;\nborder-bottom: 1px solid #efefef;\n&:last-child { \n border-bottom: none; \n}", + "children": [ + { + "type": "element", + "tagName": "h4", + "children": [ + { + "type": "element", + "tagName": "span", + "classNames": [ + "text-primary", + "mr-3" + ], + "children": [ + { + "type": "element", + "tagName": "i", + "classNames": [ + "fas" + ], + "classNameExpressions": [ + { + "js": "expanded", + "classNames": [ + "fa-minus" + ] + }, + { + "js": "!expanded", + "classNames": [ + "fa-plus" + ] + } + ], + "id": 6440995, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "style": "", + "children": [], + "propsArray": [] + } + ], + "id": 3354319, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "text", + "text": "{props.question}", + "id": 7228778, + "isVisible": true, + "children": [] + } + ], + "id": 6960241, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "if", + "js": "expanded", + "children": [ + { + "type": "element", + "tagName": "div", + "classNames": [ + "mt-3" + ], + "children": [ + { + "type": "text", + "text": "{props.answer}", + "id": 5789270, + "isVisible": true, + "children": [] + } + ], + "id": 5790683, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "id": 2390207, + "isVisible": true + } + ], + "id": 8652269, + "classNames": [ + "py-4" + ], + "isVisible": true, + "image": "", + "name": "", + "classNameExpressions": [], + "propsArray": [ + { + "key": "onClick", + "value": "() => setExpanded(!expanded)", + "isString": false, + "type": "ArrowFunctionExpression" + } + ] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "FaqItem", + "nameStyleModule": "FaqItem", + "modulePath": "src/components/FaqItem" + }, + { + "type": "component", + "name": "FAQ Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 804648, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 6565742, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 8325169, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: true,\n\tclassName: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 8283571, + "attributes": "{\n items: [\n {\n question: 'Integer ornare neque mauris?',\n answer: 'Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'Lorem ipsum dolor sit amet?',\n answer: 'Nunc nulla mauris, laoreet vel cursus lacinia, consectetur sit amet tellus. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'Suspendisse ut tincidunt?',\n answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lobortis, metus et mattis ullamcorper. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'Ut enim ad minim veniam?',\n answer: 'Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'In velit mi, rhoncus dictum neque?',\n answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.'\n }\n ]\n}", + "id": 2288967, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "items", + "value": "[\n {\n question: 'Integer ornare neque mauris?',\n answer: 'Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'Lorem ipsum dolor sit amet?',\n answer: 'Nunc nulla mauris, laoreet vel cursus lacinia, consectetur sit amet tellus. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'Suspendisse ut tincidunt?',\n answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lobortis, metus et mattis ullamcorper. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'Ut enim ad minim veniam?',\n answer: 'Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.'\n },\n {\n question: 'In velit mi, rhoncus dictum neque?',\n answer: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.'\n }\n]", + "isString": false, + "type": "ArrayExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 3246815, + "tags": [ + "FAQ", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "FaqSection", + "nameStyleModule": "FaqSection", + "modulePath": "src/components/FaqSection" + }, + { + "type": "component", + "subtype": "page-component", + "path": "contact", + "id": 2640204, + "children": [ + { + "type": "instance", + "componentId": 7059205, + "id": 1120819, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n // Text content\n\ttitle: \"Contact Us\",\n subtitle: \"\",\n buttonText: \"Send message\",\n // primary, secondary, success, danger,\n // warning, info, light, dark, link\n buttonColor: \"primary\",\n showNameField: true,\n // Size of text inputs\n inputSize: \"md\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "title", + "value": "Contact Us", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonText", + "value": "Send message", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonColor", + "value": "primary", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "showNameField", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "inputSize", + "value": "md", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "code": "", + "description": "", + "requireAuth": false, + "nameFormatted": "ContactPage", + "nameStyleModule": "ContactPage", + "modulePath": "src/pages/contact" + }, + { + "type": "component", + "name": "Contact Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 6515056, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 4617903, + "attributes": "{\n\tstyle: {\n maxWidth: '850px'\n }\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 9246100, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 2611168, + "attributes": "{\n showNameField: props.showNameField,\n buttonText: props.buttonText,\n buttonColor: props.buttonColor,\n inputSize: props.inputSize\n}", + "id": 7110211, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "showNameField", + "value": "props.showNameField", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "buttonText", + "value": "props.buttonText", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "buttonColor", + "value": "props.buttonColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputSize", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "style", + "value": "{\nmaxWidth: '850px'\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 7059205, + "tags": [ + "Contact", + "Popular" + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "code": "", + "nameFormatted": "ContactSection", + "nameStyleModule": "ContactSection", + "modulePath": "src/components/ContactSection" + }, + { + "type": "component", + "name": "Contact", + "children": [ + { + "type": "if", + "js": "formAlert", + "id": 3958600, + "children": [ + { + "type": "instance", + "componentId": 9233925, + "id": 3419736, + "attributes": "{\n\ttype: formAlert.type,\n message: formAlert.message\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "formAlert.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "message", + "value": "formAlert.message", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2030395, + "id": 7806919, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 1627034, + "id": 1426006, + "children": [ + { + "type": "if", + "js": "props.showNameField", + "id": 6969513, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 3902076, + "attributes": "{\n as: Bootstrap.Col,\n xs: 12,\n sm: 6,\n\tcontrolId: \"formName\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 1649076, + "attributes": "{\n size: props.inputSize,\n name: 'name',\n type: 'text',\n placeholder: 'Name',\n\terror: errors.name,\n inputRef: register({ \n required: \"Please enter your name\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "name", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "text", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Name", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.name", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your name\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "as", + "value": "Bootstrap.Col", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "sm", + "value": "6", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "controlId", + "value": "formName", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 4517458, + "attributes": "{\n as: Bootstrap.Col,\n xs: 12,\n sm: props.showNameField ? 6 : 12,\n\tcontrolId: \"formEmail\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 5380577, + "attributes": "{\n size: props.inputSize,\n name: 'email',\n type: 'email',\n placeholder: 'Email',\n\terror: errors.email,\n inputRef: register({ \n required: \"Please enter your email\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.email", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your email\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "as", + "value": "Bootstrap.Col", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "xs", + "value": "12", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "sm", + "value": "props.showNameField ? 6 : 12", + "isString": false, + "type": "ConditionalExpression" + }, + { + "key": "controlId", + "value": "formEmail", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 1403180, + "attributes": "{\n\tcontrolId: \"formMessage\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 9800452, + "attributes": "{\n size: props.inputSize,\n name: 'message',\n type: 'textarea',\n placeholder: 'Message',\n rows: 5,\n\terror: errors.message,\n inputRef: register({ \n required: \"Please enter a message\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "message", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "textarea", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Message", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "rows", + "value": "5", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "error", + "value": "errors.message", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter a message\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formMessage", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 1056378, + "attributes": "{\n\tvariant: props.buttonColor,\n size: props.inputSize,\n type: \"submit\",\n disabled: pending\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 6533123, + "attributes": "{\n /*\n\tstyle: {\n visibility: props.status.type === \"pending\" ?\n \t\t\t\t\t\"hidden\" :\n \t\t\t\t\t\t\"visible\"\n }*/\n}", + "children": [ + { + "type": "text", + "text": "{props.buttonText}", + "id": 2735598, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "if", + "js": "pending", + "id": 3414357, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 1385151, + "attributes": "{\n\tanimation: \"border\",\n size: \"sm\",\n role: \"status\",\n 'aria-hidden': true,\n className: \"ml-2\"\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 9534239, + "classNames": [ + "sr-only" + ], + "children": [ + { + "type": "text", + "text": "Sending...", + "id": 9164142, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "role", + "value": "status", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "aria-hidden", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "ml-2", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "props.buttonColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "type", + "value": "submit", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "disabled", + "value": "pending", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "attributes": "{\n onSubmit: handleSubmit(onSubmit)\n}", + "isVisible": true, + "propsArray": [ + { + "key": "onSubmit", + "value": "handleSubmit(onSubmit)", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "code": "\tconst [pending, setPending] = useState(false);\n\tconst [formAlert, setFormAlert] = useState(null);\t\n\tconst { handleSubmit, register, errors, reset } = useForm();\t\n\n const onSubmit = (data) => {\n // Show pending indicator\n setPending(true);\n \n contact.submit(data)\n \t.then(() => {\n \t// Clear form\n \treset();\n \t// Show success alert message\n \tsetFormAlert({\n \ttype: \"success\",\n \tmessage: \"Your message has been sent!\"\n \t});\n \t})\n \t.catch(error => {\n \t// Show error alert message\n \tsetFormAlert({\n \ttype: \"error\",\n \tmessage: error.message\n \t});\n \t})\n \t.finally(() => {\n \t// Hide pending indicator\n setPending(false);\n \t});\n }\n", + "id": 2611168, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "Contact", + "nameStyleModule": "Contact", + "modulePath": "src/components/Contact" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Form.Group", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Form", + "default": "Form" + }, + "id": 741589, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Form.Group", + "nameStyleModule": "Form.Group", + "modulePath": "react-bootstrap/Form" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Form.Control.Feedback", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Form", + "default": "Form" + }, + "id": 4008764, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Form.Control.Feedback", + "nameStyleModule": "Form.Control.Feedback", + "modulePath": "react-bootstrap/Form" + }, + { + "type": "component", + "id": 4647527, + "name": "Form Field", + "code": "\tconst { error, type, inputRef, ...inputProps } = props;\n", + "children": [ + { + "type": "if", + "js": "props.label", + "id": 4931151, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 1267893, + "id": 7649872, + "children": [ + { + "type": "text", + "text": "{props.label}", + "id": 7279146, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "isVisible": true + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4995668, + "id": 7202011, + "attributes": "{\n // HTML element based on type prop\n as: type === \"textarea\" \n \t? \"textarea\"\n \t\t: \"input\",\n type: type === \"textarea\"\n \t\t? undefined\n \t\t\t: type,\n isInvalid: error ? true : undefined,\n ref: inputRef,\n ...inputProps\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "as", + "value": "type === \"textarea\" \n ? \"textarea\"\n : \"input\"", + "isString": false, + "type": "ConditionalExpression" + }, + { + "key": "type", + "value": "type === \"textarea\"\n ? undefined\n : type", + "isString": false, + "type": "ConditionalExpression" + }, + { + "key": "isInvalid", + "value": "error ? true : undefined", + "isString": false, + "type": "ConditionalExpression" + }, + { + "key": "ref", + "value": "inputRef", + "isString": false, + "type": "Identifier" + }, + { + "key": null, + "value": "inputProps", + "isString": false, + "type": "SpreadElement" + } + ] + }, + { + "type": "if", + "js": "error", + "id": 6140480, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4008764, + "id": 4281410, + "attributes": "{\n\ttype: \"invalid\",\n className: \"text-left\"\n}", + "children": [ + { + "type": "text", + "text": "{error.message}", + "id": 4487478, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "type", + "value": "invalid", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "className", + "value": "text-left", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "FormField", + "nameStyleModule": "FormField", + "modulePath": "src/components/FormField" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Alert", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Alert", + "default": "Alert" + }, + "id": 253581, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Alert", + "nameStyleModule": "Alert", + "modulePath": "react-bootstrap/Alert" + }, + { + "type": "component", + "id": 9233925, + "name": "Form Alert", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 253581, + "id": 5112937, + "attributes": "{\n // primary, secondary, success, danger,\n // warning, info, light, dark\n\tvariant: type === \"error\" ?\n \t\t\t\t\"danger\" :\n \t\t\t\t\t\"success\",\n ...otherProps,\n}", + "children": [ + { + "type": "text", + "text": "{message}", + "id": 6431195, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "type === \"error\" ?\n \"danger\" :\n \"success\"", + "isString": false, + "type": "ConditionalExpression" + }, + { + "key": null, + "value": "otherProps", + "isString": false, + "type": "SpreadElement" + } + ] + } + ], + "code": "\tconst { type, message, ...otherProps } = props;", + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "FormAlert", + "nameStyleModule": "FormAlert", + "modulePath": "src/components/FormAlert" + }, + { + "type": "component", + "subtype": "page-component", + "path": "dashboard", + "id": 9042429, + "children": [ + { + "type": "instance", + "componentId": 4436583, + "id": 4904530, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Text content\n title: \"Dashboard\",\n subtitle: \"\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "title", + "value": "Dashboard", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "subtitle", + "value": "", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "requireAuth": true, + "isVisible": true, + "code": "", + "description": "", + "nameFormatted": "DashboardPage", + "nameStyleModule": "DashboardPage", + "modulePath": "src/pages/dashboard" + }, + { + "type": "component", + "name": "Dashboard Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 6988760, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 9356738, + "attributes": "{\n\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 1612200, + "attributes": "{\n\ttitle: props.title,\n subtitle: props.subtitle,\n // Text size (1-5)\n size: 1,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "props.title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "props.subtitle", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "if", + "js": "router.query.paid && auth.user.planIsActive", + "id": 3535565, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 253581, + "id": 6938637, + "attributes": "{\n\tvariant: \"success\",\n className: \"text-center mx-auto\",\n style: { maxWidth: \"300px\" },\n}", + "children": [ + { + "type": "text", + "text": "You are now subscribed 🥳", + "id": 1930385, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "success", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "className", + "value": "text-center mx-auto", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "style", + "value": "{ maxWidth: \"300px\" }", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9541476, + "id": 2715344, + "attributes": "{\n\tclassName: \"align-items-center mt-5\"\n}\t", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 2632293, + "attributes": "{\n\tlg: 6,\n //className: \"text-center text-lg-left\"\n}\t", + "children": [ + { + "type": "text", + "text": "<p>\nThis would be a good place to build your custom product features after exporting your codebase.\n</p>\n<p>\nYou can grab the current user, query your database, render custom components, and anything else you'd like.\n</p>\n<p>\nDivjoy sets you up with everything you need so that you can get right to work on building your web app.\n</p>", + "id": 3186013, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "lg", + "value": "6", + "isString": false, + "type": "NumericLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9152506, + "id": 6869764, + "attributes": "{\n\tclassName: \"mt-5 mt-lg-0\"\n}\t", + "children": [ + { + "type": "element", + "tagName": "figure", + "id": 6190658, + "classNames": [ + "mx-auto" + ], + "style": "max-width: 370px;", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4825682, + "id": 584515, + "attributes": "{\n\tsrc: \"https://uploads.divjoy.com/undraw-personal_settings_kihd.svg\",\n fluid: true\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "src", + "value": "https://uploads.divjoy.com/undraw-personal_settings_kihd.svg", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "fluid", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + } + ] + } + ], + "name": "Image Container", + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "classNameExpressions": [], + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "mt-5 mt-lg-0", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "align-items-center mt-5", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "div", + "id": 5085351, + "classNames": [ + "mt-5", + "mx-auto", + "text-center" + ], + "attributes": "{\n\tstyle: {\n maxWidth: \"460px\"\n }\n}", + "children": [ + { + "type": "element", + "tagName": "small", + "id": 4018575, + "children": [ + { + "type": "text", + "text": "Some helpful debug info 🐛", + "id": 4816525, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 6820673, + "id": 5975077, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2718339, + "id": 2648928, + "children": [ + { + "type": "text", + "text": "Logged in as <strong>{auth.user.email}</strong>", + "id": 259632, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2718339, + "id": 7994933, + "children": [ + { + "type": "if", + "js": "auth.user.stripeSubscriptionId", + "id": 2288192, + "children": [ + { + "type": "text", + "text": "Subscription data\n<br/>\nID: <strong>{auth.user.stripeSubscriptionId}</strong>\n<br/>\nPrice ID: <strong>{auth.user.stripePriceId}</strong>\n<br/>\nStatus: <strong>{auth.user.stripeSubscriptionStatus}</strong>", + "id": 5998002, + "isVisible": true, + "children": [] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "!auth.user.stripeSubscriptionId", + "id": 5190986, + "children": [ + { + "type": "element", + "tagName": "a", + "attributes": "{\n href: '/pricing' \n}", + "children": [ + { + "type": "text", + "text": "Subscribe to a plan", + "id": 6090034, + "isVisible": true, + "children": [] + } + ], + "id": 3834502, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/pricing", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2718339, + "id": 1393808, + "children": [ + { + "type": "element", + "tagName": "a", + "attributes": "{\n href: '/settings/general' \n}", + "children": [ + { + "type": "text", + "text": "Account settings", + "id": 5806719, + "isVisible": true, + "children": [] + } + ], + "id": 9434738, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/settings/general", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "attributes": "{\n\tclassName: \"mt-2\"\n}", + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "mt-2", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "style", + "value": "{\nmaxWidth: \"460px\"\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "id": 4436583, + "code": "\tconst auth = useAuth();\t\n\tconst router = useRouter();\n", + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "DashboardSection", + "nameStyleModule": "DashboardSection", + "modulePath": "src/components/DashboardSection" + }, + { + "type": "component", + "subtype": "page-component", + "path": "auth/:type", + "id": 5450495, + "code": "\tconst router = useRouter();\n", + "children": [ + { + "type": "instance", + "componentId": 8572886, + "id": 213555, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n // Size of text inputs\n inputSize: \"lg\",\n // signin, signup, forgotpass, changepass\n type: router.query.type,\n // Enable other auth providers\n // google, facebook, twitter, github\n providers: ['google', 'facebook', 'twitter'],\n // Where to take user after auth\n afterAuthPath: router.query.next || \"/dashboard\"\n // Scroll down to \"Code\" section\n // to customize further.\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "inputSize", + "value": "lg", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "router.query.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "providers", + "value": "['google', 'facebook', 'twitter']", + "isString": false, + "type": "ArrayExpression" + }, + { + "key": "afterAuthPath", + "value": "router.query.next || \"/dashboard\"", + "isString": false, + "type": "LogicalExpression" + } + ] + } + ], + "isVisible": true, + "description": "", + "requireAuth": false, + "nameFormatted": "AuthPage", + "nameStyleModule": "AuthPage", + "modulePath": "src/pages/auth" + }, + { + "type": "component", + "id": 4743961, + "name": "Auth Form", + "code": "\tconst [pending, setPending] = useState(false);\n\tconst { handleSubmit, register, errors, getValues } = useForm();\n\n const submitHandlersByType = {\n signin: ({ email, pass }) => {\n return auth.signin(email, pass)\n .then(user => {\n \t// Call auth complete handler\n \tprops.onAuth(user);\n \t});\n },\n signup: ({ email, pass }) => {\n return auth.signup(email, pass)\n .then(user => {\n \t// Call auth complete handler\n \tprops.onAuth(user);\n \t});\n },\n forgotpass: ({ email }) => {\n return auth.sendPasswordResetEmail(email)\n \t.then(() => {\n \t// Show success alert message\n \t\tprops.onFormAlert({\n \ttype: \"success\",\n \tmessage: \"Password reset email sent\"\n \t});\n });\n },\n changepass: ({ pass }) => {\n return auth.confirmPasswordReset(pass)\n .then(() => {\n \t// Show success alert message\n props.onFormAlert({\n type: \"success\",\n message: \"Your password has been changed\"\n });\n });\n }\n }\n \n // Handle form submission\n const onSubmit = ({ email, pass }) => {\n // Show pending indicator\n setPending(true);\n \n // Call submit handler for auth type\n submitHandlersByType[props.type]({\n email,\n pass\n }).catch(error => {\n // Show error alert message\n props.onFormAlert({\n type: \"error\",\n message: error.message\n });\n }).finally(() => {\n // Hide pending indicator\n setPending(false);\n });\n }\n ", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2030395, + "id": 3450313, + "children": [ + { + "type": "if", + "js": "['signup', 'signin', 'forgotpass'].includes(props.type)", + "id": 9372840, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 497285, + "attributes": "{\n\tcontrolId: \"formEmail\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 5923978, + "attributes": "{\n size: props.inputSize,\n name: 'email',\n type: 'email',\n placeholder: 'Email',\n\terror: errors.email,\n inputRef: register({ \n required: \"Please enter an email\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.email", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter an email\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formEmail", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "['signup', 'signin', 'changepass'].includes(props.type)", + "id": 4777862, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 5788792, + "attributes": "{\n\tcontrolId: \"formPassword\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 105584, + "attributes": "{\n size: props.inputSize,\n name: 'pass',\n type: 'password',\n placeholder: 'Password',\n\terror: errors.pass,\n inputRef: register({ \n required: \"Please enter a password\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "pass", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.pass", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter a password\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formPassword", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "['signup', 'changepass'].includes(props.type)", + "id": 9297671, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 6971812, + "attributes": "{\n\tcontrolId: \"formConfirmPass\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 2276629, + "attributes": "{\n size: props.inputSize,\n name: 'confirmPass',\n type: 'password',\n placeholder: 'Confirm Password',\n\terror: errors.confirmPass,\n inputRef: register({ \n required: \"Please enter your password again\",\n validate: (value) => { \n if (value === getValues().pass){\n return true;\n }else{\n return \"This doesn't match your password\";\n }\n }\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "confirmPass", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Confirm Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.confirmPass", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your password again\",\n validate: (value) => { \n if (value === getValues().pass){\n return true;\n }else{\n return \"This doesn't match your password\";\n }\n }\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formConfirmPass", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 1654593, + "attributes": "{\n\tvariant: \"primary\",\n block: true,\n size: props.inputSize,\n type: \"submit\",\n disabled: pending\n}", + "children": [ + { + "type": "if", + "js": "!pending", + "id": 7720618, + "children": [ + { + "type": "element", + "tagName": "span", + "id": 7377049, + "attributes": "{\n /*\n\tstyle: {\n visibility: props.status.type === \"pending\" ?\n \t\t\t\t\t\"hidden\" :\n \t\t\t\t\t\t\"visible\"\n }*/\n}", + "children": [ + { + "type": "text", + "text": "{props.typeValues.buttonText}", + "id": 4422899, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "pending", + "id": 1801371, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 8479073, + "attributes": "{\n\tanimation: \"border\",\n size: \"sm\",\n role: \"status\",\n 'aria-hidden': true,\n className: \"align-baseline\"\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 971288, + "classNames": [ + "sr-only" + ], + "children": [ + { + "type": "text", + "text": "Loading...", + "id": 7458464, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "role", + "value": "status", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "aria-hidden", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "align-baseline", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "primary", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "block", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "type", + "value": "submit", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "disabled", + "value": "pending", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "attributes": "{\n onSubmit: handleSubmit(onSubmit)\n}", + "isVisible": true, + "propsArray": [ + { + "key": "onSubmit", + "value": "handleSubmit(onSubmit)", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "AuthForm", + "nameStyleModule": "AuthForm", + "modulePath": "src/components/AuthForm" + }, + { + "type": "component", + "id": 5389937, + "name": "Auth Footer", + "children": [ + { + "type": "element", + "tagName": "div", + "classNames": [ + "text-center", + "mt-4" + ], + "children": [ + { + "type": "if", + "js": "props.type === \"signup\"", + "children": [ + { + "type": "text", + "text": "Have an account already?", + "id": 7504179, + "isVisible": true, + "children": [] + }, + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "text", + "text": "{props.typeValues.linkTextSignin}", + "id": 1871921, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n href: '/auth/signin'\n}", + "id": 7046653, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/auth/signin", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 2669878, + "isVisible": true + }, + { + "type": "if", + "js": "props.type === 'signin'", + "children": [ + { + "type": "element", + "tagName": "a", + "children": [ + { + "type": "text", + "text": "{props.typeValues.linkTextSignup}", + "id": 254649, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n href: '/auth/signup'\n}", + "id": 612644, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/auth/signup", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "element", + "tagName": "a", + "attributes": "{\n href: '/auth/forgotpass'\n}", + "children": [ + { + "type": "text", + "text": "{props.typeValues.linkTextForgotpass}", + "id": 5291797, + "isVisible": true, + "children": [] + } + ], + "id": 1934229, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [ + { + "key": "href", + "value": "/auth/forgotpass", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "id": 1663348, + "isVisible": true + } + ], + "style": "font-size: 0.9rem;\na {\n margin: 0 0.5rem;\n}", + "id": 8206775, + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "propsArray": [] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "AuthFooter", + "nameStyleModule": "AuthFooter", + "modulePath": "src/components/AuthFooter" + }, + { + "type": "component", + "id": 9452872, + "name": "Auth Social", + "code": "\tconst auth = useAuth();\n\tconst [pending, setPending] = useState(null);\n\tconst [lastUsed, setLastUsed] = useState(null);\n\n\tconst providerDisplayNames = {\n google: \"Google\",\n facebook: \"Facebook\",\n twitter: \"Twitter\",\n github: \"GitHub\"\n }\n \n const onSigninWithProvider = (provider) => {\n setPending(provider);\n auth.signinWithProvider(provider)\n \t.then(user => {\n \tlocalStorage.setItem('lastUsedAuthProvider', provider);\n \tprops.onAuth(user);\n \t})\n .catch(error => {\n \tprops.onError(error.message);\n \t})\n \t.finally(() => {\n \tsetPending(null);\n \t})\n }\n \n // Get value of last used auth provider\n useEffect(() => {\n if (props.showLastUsed){\n const lastUsed = window.localStorage.getItem('lastUsedAuthProvider');\n if (lastUsed){\n setLastUsed(lastUsed);\n }\n }\n }, [props.showLastUsed]);\n ", + "children": [ + { + "type": "foreach", + "id": 3650427, + "valName": "provider", + "objectName": "props.providers", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 887207, + "attributes": "{\n // primary, secondary, success, danger,\n // warning, info, light, dark, link\n\tvariant: \"light\",\n size: props.inputSize,\n block: true,\n onClick: () => {\n onSigninWithProvider(provider);\n },\n \n className: \"position-relative\",\n key: provider\n}", + "children": [ + { + "type": "element", + "tagName": "div", + "id": 1187352, + "name": "Icon", + "style": "position: absolute;\nalign-items: center;\ndisplay: inline-flex;\njustify-content: center;\nwidth: 1.5em;\nheight: 1.5em;\nleft: 0.5em;\nimg {\n display: block;\n width: 20px;\n}", + "children": [ + { + "type": "element", + "tagName": "img", + "attributes": "{\n src: `https://uploads.divjoy.com/icon-${provider}.svg`,\n alt: providerDisplayNames[provider]\n}", + "id": 3433992, + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "children": [], + "propsArray": [ + { + "key": "src", + "value": "`https://uploads.divjoy.com/icon-${provider}.svg`", + "isString": false, + "type": "TemplateLiteral" + }, + { + "key": "alt", + "value": "providerDisplayNames[provider]", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "classNames": [], + "classNameExpressions": [], + "propsArray": [] + }, + { + "type": "if", + "js": "pending !== provider", + "id": 6735541, + "children": [ + { + "type": "element", + "tagName": "span", + "id": 8599642, + "children": [ + { + "type": "text", + "text": "{props.buttonText} with {providerDisplayNames[provider]}", + "id": 2965270, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "pending === provider", + "id": 4314503, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 2586210, + "attributes": "{\n\tanimation: \"border\",\n size: \"sm\",\n role: \"status\",\n 'aria-hidden': true,\n className: \"align-baseline text-primary\"\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 3326460, + "classNames": [ + "sr-only" + ], + "children": [ + { + "type": "text", + "text": "Loading...", + "id": 5372563, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "role", + "value": "status", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "aria-hidden", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "align-baseline text-primary", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "provider === lastUsed", + "id": 331977, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 4059464, + "id": 1226629, + "children": [ + { + "type": "text", + "text": "Last used", + "id": 7111486, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\tvariant: \"warning\",\n className: \"position-absolute font-weight-normal\",\n style: {\n top: \"-6px\",\n right: \"-6px\",\n opacity: 0.70\n }\n}", + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "warning", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "className", + "value": "position-absolute font-weight-normal", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "style", + "value": "{\n top: \"-6px\",\n right: \"-6px\",\n opacity: 0.70\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "light", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "block", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "onClick", + "value": "() => {\n onSigninWithProvider(provider);\n}", + "isString": false, + "type": "ArrowFunctionExpression" + }, + { + "key": "className", + "value": "position-relative", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "key", + "value": "provider", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "isVisible": true, + "objectType": "array", + "indexName": "" + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "AuthSocial", + "nameStyleModule": "AuthSocial", + "modulePath": "src/components/AuthSocial" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Badge", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Badge", + "default": "Badge" + }, + "id": 4059464, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Badge", + "nameStyleModule": "Badge", + "modulePath": "react-bootstrap/Badge" + }, + { + "type": "component", + "name": "Auth", + "children": [ + { + "type": "if", + "js": "formAlert", + "id": 5515628, + "children": [ + { + "type": "instance", + "componentId": 9233925, + "id": 5960054, + "attributes": "{\n\ttype: formAlert.type,\n message: formAlert.message\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "formAlert.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "message", + "value": "formAlert.message", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "componentId": 4743961, + "id": 1767961, + "attributes": "{\n type: props.type,\n typeValues: props.typeValues,\n inputSize: props.inputSize,\n onAuth: handleAuth,\n onFormAlert: handleFormAlert\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "props.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "typeValues", + "value": "props.typeValues", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputSize", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "onAuth", + "value": "handleAuth", + "isString": false, + "type": "Identifier" + }, + { + "key": "onFormAlert", + "value": "handleFormAlert", + "isString": false, + "type": "Identifier" + } + ] + }, + { + "type": "if", + "js": "['signup', 'signin'].includes(props.type)", + "id": 2586594, + "children": [ + { + "type": "if", + "js": "props.providers && props.providers.length", + "id": 4518795, + "children": [ + { + "type": "element", + "tagName": "small", + "id": 1355012, + "classNames": [ + "text-center", + "d-block", + "my-3" + ], + "children": [ + { + "type": "text", + "text": "OR", + "id": 9034007, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "instance", + "componentId": 9452872, + "id": 393132, + "attributes": "{\n\ttype: props.type,\n buttonText: props.typeValues.buttonText,\n inputSize: props.inputSize,\n providers: props.providers,\n showLastUsed: true,\n onAuth: handleAuth,\n onError: (message) => {\n handleFormAlert({\n type: \"error\",\n message: message\n })\n }\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "props.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "buttonText", + "value": "props.typeValues.buttonText", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputSize", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "providers", + "value": "props.providers", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "showLastUsed", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "onAuth", + "value": "handleAuth", + "isString": false, + "type": "Identifier" + }, + { + "key": "onError", + "value": "(message) => {\n handleFormAlert({\n type: \"error\",\n message: message\n })\n}", + "isString": false, + "type": "ArrowFunctionExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "componentId": 5389937, + "id": 6349832, + "attributes": "{\n\ttype: props.type,\n typeValues: props.typeValues,\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "props.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "typeValues", + "value": "props.typeValues", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true + } + ], + "code": "\tconst router = useRouter();\n\tconst [formAlert, setFormAlert] = useState(null);\n\n\tconst handleAuth = (user) => {\n router.push(props.afterAuthPath);\n }\n \n const handleFormAlert = (data) => {\n setFormAlert(data);\n }\n ", + "id": 5056405, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "Auth", + "nameStyleModule": "Auth", + "modulePath": "src/components/Auth" + }, + { + "type": "component", + "name": "Auth Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 1176601, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 6794463, + "attributes": "{\n\tstyle: {\n maxWidth: '450px'\n }\n}\t", + "children": [ + { + "type": "instance", + "componentId": 5118913, + "id": 2059691, + "attributes": "{\n\ttitle: allTypeValues[currentType].title,\n subtitle: \"\",\n // Text size (1-5)\n size: 2,\n // Space between title/subtitle\n spaced: true,\n className: \"text-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "title", + "value": "allTypeValues[currentType].title", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "subtitle", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "2", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "spaced", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "text-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "componentId": 5056405, + "attributes": "{\n \ttype: currentType,\n typeValues: typeValues,\n inputSize: props.inputSize,\n providers: props.providers,\n afterAuthPath: props.afterAuthPath,\n // Remount (clear state) if type changes\n key: currentType\n}", + "id": 9435892, + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "currentType", + "isString": false, + "type": "Identifier" + }, + { + "key": "typeValues", + "value": "typeValues", + "isString": false, + "type": "Identifier" + }, + { + "key": "inputSize", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "providers", + "value": "props.providers", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "afterAuthPath", + "value": "props.afterAuthPath", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "key", + "value": "currentType", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "style", + "value": "{\nmaxWidth: '450px'\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "code": "\t// Values for each auth type\n\tconst allTypeValues = {\n signin: {\n // Top title\n title: \"Welcome back\",\n // Submit button text\n buttonText: \"Sign in\",\n // Link text to other auth types\n linkTextSignup: \"Create an account\",\n linkTextForgotpass: \"Forgot Password?\"\n },\n signup: {\n title: \"Get yourself an account\",\n buttonText: \"Sign up\",\n linkTextSignin: \"Sign in\"\n },\n forgotpass: {\n title: \"Get a new password\",\n buttonText: \"Reset password\"\n },\n changepass: {\n title: \"Choose a new password\",\n buttonText: \"Change password\"\n },\n };\n\t\n\t// Ensure we have a valid auth type\n\tconst currentType = allTypeValues[props.type] \n \t\t\t\t\t\t\t\t\t\t\t? props.type \n \t\t\t\t\t\t\t\t\t\t\t: 'signup';\n\n\t// Get values for current auth type\n\tconst typeValues = allTypeValues[currentType];\n ", + "tags": [ + "Authentication" + ], + "id": 8572886, + "isVisible": true, + "nameLibrary": "", + "description": "", + "nameFormatted": "AuthSection", + "nameStyleModule": "AuthSection", + "modulePath": "src/components/AuthSection" + }, + { + "type": "component", + "subtype": "page-component", + "path": "settings/:section", + "id": 5150340, + "children": [ + { + "type": "instance", + "componentId": 2791369, + "id": 8788474, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"md\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n // Settings section (general, password, billing)\n section: router.query.section,\n // Add key so state resets when section changes\n\tkey: router.query.section,\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "section", + "value": "router.query.section", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "key", + "value": "router.query.section", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "requireAuth": true, + "code": "\tconst router = useRouter();\n", + "isVisible": true, + "description": "", + "nameFormatted": "SettingsPage", + "nameStyleModule": "SettingsPage", + "modulePath": "src/pages/settings" + }, + { + "type": "component", + "name": "Settings Section", + "children": [ + { + "type": "instance", + "componentId": 1219852, + "id": 1534263, + "attributes": "{\n\tbg: props.bg,\n textColor: props.textColor,\n size: props.size,\n bgImage: props.bgImage,\n bgImageOpacity: props.bgImageOpacity\n}", + "children": [ + { + "type": "if", + "js": "reauthState.show", + "id": 9709856, + "children": [ + { + "type": "instance", + "componentId": 8490567, + "id": 7088780, + "attributes": "{\n\tcallback: reauthState.callback,\n provider: auth.user.providers[0],\n onDone: () => setReauthState({ show: false })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "callback", + "value": "reauthState.callback", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "provider", + "value": "auth.user.providers[0]", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "onDone", + "value": "() => setReauthState({ show: false })", + "isString": false, + "type": "ArrowFunctionExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "instance", + "componentId": 5208302, + "id": 8914950, + "attributes": "{\n activeKey: section,\n className: \"justify-content-center\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "activeKey", + "value": "section", + "isString": false, + "type": "Identifier" + }, + { + "key": "className", + "value": "justify-content-center", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2178390, + "id": 1192149, + "attributes": "{\n className: \"mt-5\",\n\tstyle: {\n maxWidth: section !== \"billing\" \n ? \"450px\" \n \t: undefined\n }\n}\t", + "children": [ + { + "type": "if", + "js": "formAlert", + "id": 8288789, + "children": [ + { + "type": "instance", + "componentId": 9233925, + "id": 221167, + "attributes": "{\n\ttype: formAlert.type,\n message: formAlert.message,\n className: \"mx-auto mb-4\",\n style: { maxWidth: \"450px\" }\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "formAlert.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "message", + "value": "formAlert.message", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "className", + "value": "mx-auto mb-4", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "style", + "value": "{ maxWidth: \"450px\" }", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "section === \"general\"", + "id": 9084047, + "children": [ + { + "type": "instance", + "componentId": 2295747, + "id": 4561907, + "attributes": "{\n\tonStatus: handleStatus\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "onStatus", + "value": "handleStatus", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "section === \"password\"", + "id": 3679723, + "children": [ + { + "type": "instance", + "componentId": 7826402, + "id": 8752303, + "attributes": "{\n\tonStatus: handleStatus\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "onStatus", + "value": "handleStatus", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "section === \"billing\"", + "id": 4596379, + "children": [ + { + "type": "instance", + "componentId": 7876694, + "id": 9029070, + "attributes": "{\n\tonStatus: handleStatus\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "onStatus", + "value": "handleStatus", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "className", + "value": "mt-5", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "style", + "value": "{\nmaxWidth: section !== \"billing\" \n ? \"450px\" \n : undefined\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "bg", + "value": "props.bg", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "textColor", + "value": "props.textColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.size", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImage", + "value": "props.bgImage", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "bgImageOpacity", + "value": "props.bgImageOpacity", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "tags": [ + "Hero", + "Popular" + ], + "code": "\tconst auth = useAuth();\t\n\tconst [formAlert, setFormAlert] = useState(null);\n\n\t// State to control whether we show a re-authentication flow\n // Required by some security sensitive actions, such as changing password.\n const [reauthState, setReauthState] = useState({\n show: false,\n });\n\n\tconst validSections = {\n \"general\": true,\n \"password\": true,\n \"billing\": true,\n };\n\n\tconst section = validSections[props.section] \n \t? props.section\n \t: \"general\";\n\n\t// Handle status of type \"success\", \"error\", or \"requires-recent-login\"\n // We don't treat \"requires-recent-login\" as an error as we handle it\n // gracefully by taking the user through a re-authentication flow.\n const handleStatus = ({ type, message, callback }) => {\n if (type === \"requires-recent-login\") {\n // First clear any existing message\n setFormAlert(null);\n // Then update state to show re-authentication modal\n setReauthState({\n show: true,\n // Failed action to try again after reauth\n callback: callback,\n });\n } else {\n // Display message to user (type is success or error)\n setFormAlert({\n type: type,\n message: message,\n });\n }\n };\n", + "id": 2791369, + "isVisible": true, + "nameLibrary": "", + "description": "", + "nameFormatted": "SettingsSection", + "nameStyleModule": "SettingsSection", + "modulePath": "src/components/SettingsSection" + }, + { + "type": "component", + "name": "Settings General", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2030395, + "id": 1813651, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 5225386, + "attributes": "{\n\tcontrolId: \"formName\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 6278030, + "attributes": "{\n name: 'name',\n type: 'text',\n label: 'Name',\n defaultValue: auth.user.name,\n placeholder: 'Name',\n\terror: errors.name,\n inputRef: register({ \n required: \"Please enter your name\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "name", + "value": "name", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "text", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "label", + "value": "Name", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "defaultValue", + "value": "auth.user.name", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "placeholder", + "value": "Name", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.name", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your name\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formName", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 7435624, + "attributes": "{\n\tcontrolId: \"formEmail\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 5955657, + "attributes": "{\n name: 'email',\n type: 'email',\n label: 'Email Address',\n defaultValue: auth.user.email,\n placeholder: 'Email',\n\terror: errors.email,\n inputRef: register({ \n required: \"Please enter your email\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "name", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "label", + "value": "Email Address", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "defaultValue", + "value": "auth.user.email", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "placeholder", + "value": "Email", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.email", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your email\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formEmail", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 5450954, + "attributes": "{\n type: \"submit\",\n disabled: pending\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 1195039, + "attributes": "{\n /*\n\tstyle: {\n visibility: props.status.type === \"pending\" ?\n \t\t\t\t\t\"hidden\" :\n \t\t\t\t\t\t\"visible\"\n }*/\n}", + "children": [ + { + "type": "text", + "text": "Save", + "id": 6069848, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "if", + "js": "pending", + "id": 3511078, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 6201143, + "attributes": "{\n\tanimation: \"border\",\n size: \"sm\",\n role: \"status\",\n 'aria-hidden': true,\n className: \"ml-2\"\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 2336423, + "classNames": [ + "sr-only" + ], + "children": [ + { + "type": "text", + "text": "Sending...", + "id": 5576952, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "role", + "value": "status", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "aria-hidden", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "ml-2", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "type", + "value": "submit", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "disabled", + "value": "pending", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "attributes": "{\n onSubmit: handleSubmit(onSubmit)\n}", + "isVisible": true, + "propsArray": [ + { + "key": "onSubmit", + "value": "handleSubmit(onSubmit)", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "code": " const auth = useAuth();\n\tconst [pending, setPending] = useState(false);\n\n const { \n register, \n handleSubmit, \n errors\n } = useForm();\n\n const onSubmit = data => {\n // Show pending indicator\n\t\tsetPending(true);\n \n return auth\n .updateProfile(data)\n .then(() => {\n // Set success status\n props.onStatus({\n type: \"success\",\n message: \"Your profile has been updated\",\n });\n })\n .catch(error => {\n \tif (error.code === \"auth/requires-recent-login\") {\n props.onStatus({\n type: \"requires-recent-login\",\n // Resubmit after reauth flow\n callback: () => onSubmit(data),\n });\n }else{\n\t\t\t\t\t// Set error status\n props.onStatus({\n type: \"error\",\n message: error.message,\n });\n }\n })\n .finally(() => {\n \t// Hide pending indicator\n \tsetPending(false);\n \t});\n };\n", + "id": 2295747, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "SettingsGeneral", + "nameStyleModule": "SettingsGeneral", + "modulePath": "src/components/SettingsGeneral" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Form.Label", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Form", + "default": "Form" + }, + "id": 1267893, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Form.Label", + "nameStyleModule": "Form.Label", + "modulePath": "react-bootstrap/Form" + }, + { + "type": "component", + "name": "Settings Password", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2030395, + "id": 3722544, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 6416742, + "attributes": "{\n\tcontrolId: \"formName\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 9626560, + "attributes": "{\n name: 'pass',\n type: 'password',\n label: 'New Password',\n placeholder: 'Password',\n\terror: errors.pass,\n inputRef: register({ \n required: \"Please enter a password\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "name", + "value": "pass", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "label", + "value": "New Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.pass", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter a password\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formName", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 4710589, + "attributes": "{\n\tcontrolId: \"formEmail\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 5179214, + "attributes": "{\n name: 'confirmPass',\n type: 'password',\n label: 'Confirm New Password',\n placeholder: 'Confirm Password',\n\terror: errors.confirmPass,\n inputRef: register({ \n required: \"Please enter your new password again\",\n validate: (value) => { \n if (value === getValues().pass){\n return true;\n }else{\n return \"This doesn't match your password\";\n }\n }\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "name", + "value": "confirmPass", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "label", + "value": "Confirm New Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Confirm Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.confirmPass", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your new password again\",\n validate: (value) => { \n if (value === getValues().pass){\n return true;\n }else{\n return \"This doesn't match your password\";\n }\n }\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formEmail", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 4852758, + "attributes": "{\n\tvariant: props.buttonColor,\n size: props.inputSize,\n type: \"submit\",\n disabled: pending\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 2547351, + "attributes": "{\n /*\n\tstyle: {\n visibility: props.status.type === \"pending\" ?\n \t\t\t\t\t\"hidden\" :\n \t\t\t\t\t\t\"visible\"\n }*/\n}", + "children": [ + { + "type": "text", + "text": "Save", + "id": 4157669, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "if", + "js": "pending", + "id": 817418, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 6504524, + "attributes": "{\n\tanimation: \"border\",\n size: \"sm\",\n role: \"status\",\n 'aria-hidden': true,\n className: \"ml-2\"\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 3349169, + "classNames": [ + "sr-only" + ], + "children": [ + { + "type": "text", + "text": "Sending...", + "id": 5281520, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "role", + "value": "status", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "aria-hidden", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "ml-2", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "props.buttonColor", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "type", + "value": "submit", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "disabled", + "value": "pending", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "attributes": "{\n onSubmit: handleSubmit(onSubmit)\n}", + "isVisible": true, + "propsArray": [ + { + "key": "onSubmit", + "value": "handleSubmit(onSubmit)", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "code": " \tconst auth = useAuth();\n\tconst [pending, setPending] = useState(false);\n\n const { \n register, \n handleSubmit, \n errors, \n reset, \n getValues \n } = useForm();\n\n const onSubmit = data => {\n // Show pending indicator\n\t\tsetPending(true);\n \n auth\n .updatePassword(data.pass)\n .then(() => {\n \t// Clear form\n reset();\n \t\t\t\t// Set success status\n props.onStatus({\n type: \"success\",\n message: \"Your password has been updated\",\n });\n })\n .catch(error => {\n \tif (error.code === \"auth/requires-recent-login\") {\n // Update state to show re-authentication modal\n props.onStatus({\n type: \"requires-recent-login\",\n // Resubmit after reauth flow\n callback: () => onSubmit({ pass: data.pass }),\n });\n } else {\n // Set error status\n props.onStatus({\n type: \"error\",\n message: error.message,\n });\n }\n })\n \t.finally(() => {\n \t// Hide pending indicator\n \tsetPending(false);\n \t});\n };\n", + "id": 7826402, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "SettingsPassword", + "nameStyleModule": "SettingsPassword", + "modulePath": "src/components/SettingsPassword" + }, + { + "type": "component", + "id": 5208302, + "name": "Settings Nav", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 8654202, + "id": 1701748, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 3874764, + "id": 2496672, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2031462, + "id": 3727190, + "children": [ + { + "type": "text", + "text": "General", + "id": 2061355, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\teventKey: \"general\",\n href: \"/settings/general\",\n}", + "isVisible": true, + "propsArray": [ + { + "key": "eventKey", + "value": "general", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "href", + "value": "/settings/general", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 3874764, + "id": 2514577, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2031462, + "id": 6192910, + "children": [ + { + "type": "text", + "text": "Password", + "id": 5378363, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\teventKey: \"password\",\n href: \"/settings/password\",\n}", + "isVisible": true, + "propsArray": [ + { + "key": "eventKey", + "value": "password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "href", + "value": "/settings/password", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 3874764, + "id": 6143009, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2031462, + "id": 2971171, + "children": [ + { + "type": "text", + "text": "Billing", + "id": 4219673, + "isVisible": true, + "children": [] + } + ], + "attributes": "{\n\teventKey: \"billing\",\n href: \"/settings/billing\",\n}", + "isVisible": true, + "propsArray": [ + { + "key": "eventKey", + "value": "billing", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "href", + "value": "/settings/billing", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "attributes": "{\n\tvariant: \"pills\",\n\t...props\n}", + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "pills", + "isString": true, + "type": "StringLiteral" + }, + { + "key": null, + "value": "props", + "isString": false, + "type": "SpreadElement" + } + ] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "code": "", + "nameFormatted": "SettingsNav", + "nameStyleModule": "SettingsNav", + "modulePath": "src/components/SettingsNav" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Dropdown.Divider", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Dropdown", + "default": "Dropdown" + }, + "id": 7194631, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Dropdown.Divider", + "nameStyleModule": "Dropdown.Divider", + "modulePath": "react-bootstrap/Dropdown" + }, + { + "type": "component", + "id": 8490567, + "name": "Reauth Modal", + "code": "\tconst auth = useAuth();\n\tconst [pending, setPending] = useState(false);\n const [formAlert, setFormAlert] = useState(null);\n\n const { register, handleSubmit, errors } = useForm();\n\n const onSubmit = data => {\n const { pass } = data;\n setPending(true);\n \n auth\n .signin(auth.user.email, pass)\n .then(() => {\n // Call failed action that originally required reauth\n props.callback();\n // Let parent know we're done so they can hide modal\n props.onDone();\n \t})\n .catch(error => {\n // Hide pending indicator\n \tsetPending(false);\n \t// Show error alert message\n setFormAlert({\n type: \"error\",\n message: error.message\n });\n });\n };\n", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2483545, + "id": 7627534, + "attributes": "{\n\tshow: true,\n onHide: props.onDone\n}", + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9673748, + "id": 335467, + "attributes": "{\n\tcloseButton: true\n}", + "children": [ + { + "type": "text", + "text": "Please sign in again to complete this action", + "id": 6401786, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "closeButton", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 9153689, + "id": 294773, + "children": [ + { + "type": "if", + "js": "formAlert", + "id": 5919612, + "children": [ + { + "type": "instance", + "componentId": 9233925, + "id": 7151111, + "attributes": "{\n\ttype: formAlert.type,\n message: formAlert.message\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "formAlert.type", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "message", + "value": "formAlert.message", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "props.provider === \"password\"", + "id": 889215, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 2030395, + "id": 7201135, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 741589, + "id": 11809, + "attributes": "{\n\tcontrolId: \"formConfirmPass\"\n}", + "children": [ + { + "type": "instance", + "componentId": 4647527, + "id": 5103447, + "attributes": "{\n size: props.inputSize,\n name: 'pass',\n type: 'password',\n placeholder: 'Password',\n\terror: errors.pass,\n inputRef: register({ \n required: \"Please enter your password\"\n })\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "size", + "value": "props.inputSize", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "name", + "value": "pass", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "type", + "value": "password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "placeholder", + "value": "Password", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "error", + "value": "errors.pass", + "isString": false, + "type": "MemberExpression" + }, + { + "key": "inputRef", + "value": "register({ \n required: \"Please enter your password\"\n})", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "controlId", + "value": "formConfirmPass", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "instance", + "subtype": "external-instance", + "componentId": 7042691, + "id": 7592753, + "attributes": "{\n\tvariant: \"primary\",\n block: true,\n type: \"submit\",\n disabled: pending\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 1938133, + "attributes": "{\n /*\n\tstyle: {\n visibility: props.status.type === \"pending\" ?\n \t\t\t\t\t\"hidden\" :\n \t\t\t\t\t\t\"visible\"\n }*/\n}", + "children": [ + { + "type": "text", + "text": "Submit", + "id": 7154879, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "image": "", + "name": "", + "classNames": [], + "classNameExpressions": [], + "style": "", + "propsArray": [] + }, + { + "type": "if", + "js": "pending", + "id": 5608090, + "children": [ + { + "type": "instance", + "subtype": "external-instance", + "componentId": 146872, + "id": 654962, + "attributes": "{\n\tanimation: \"border\",\n size: \"sm\",\n role: \"status\",\n 'aria-hidden': true,\n className: \"ml-2\"\n}", + "children": [ + { + "type": "element", + "tagName": "span", + "id": 9491509, + "classNames": [ + "sr-only" + ], + "children": [ + { + "type": "text", + "text": "Loading...", + "id": 129717, + "isVisible": true, + "children": [] + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "image": "", + "name": "", + "classNameExpressions": [], + "style": "", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "animation", + "value": "border", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "role", + "value": "status", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "aria-hidden", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "className", + "value": "ml-2", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "variant", + "value": "primary", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "block", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "type", + "value": "submit", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "disabled", + "value": "pending", + "isString": false, + "type": "Identifier" + } + ] + } + ], + "attributes": "{\n\tonSubmit: handleSubmit(onSubmit)\n}", + "isVisible": true, + "propsArray": [ + { + "key": "onSubmit", + "value": "handleSubmit(onSubmit)", + "isString": false, + "type": "CallExpression" + } + ] + } + ], + "isVisible": true + }, + { + "type": "if", + "js": "props.provider !== \"password\"", + "id": 8167089, + "children": [ + { + "type": "instance", + "componentId": 9452872, + "id": 9140471, + "attributes": "{\n\ttype: \"signin\",\n buttonText: \"Sign in\",\n providers: [props.provider],\n showLastUsed: false,\n onAuth: () => {\n props.callback();\n \tprops.onDone();\n },\n onError: (message) => {\n setFormAlert({\n type: \"error\",\n message: message\n })\n }\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "type", + "value": "signin", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "buttonText", + "value": "Sign in", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "providers", + "value": "[props.provider]", + "isString": false, + "type": "ArrayExpression" + }, + { + "key": "showLastUsed", + "value": "false", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "onAuth", + "value": "() => {\n props.callback();\n props.onDone();\n}", + "isString": false, + "type": "ArrowFunctionExpression" + }, + { + "key": "onError", + "value": "(message) => {\n setFormAlert({\n type: \"error\",\n message: message\n })\n}", + "isString": false, + "type": "ArrowFunctionExpression" + } + ] + } + ], + "isVisible": true + } + ], + "isVisible": true, + "attributes": "{\n\n}", + "propsArray": [] + } + ], + "isVisible": true, + "propsArray": [ + { + "key": "show", + "value": "true", + "isString": false, + "type": "BooleanLiteral" + }, + { + "key": "onHide", + "value": "props.onDone", + "isString": false, + "type": "MemberExpression" + } + ] + } + ], + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "ReauthModal", + "nameStyleModule": "ReauthModal", + "modulePath": "src/components/ReauthModal" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Modal", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Modal", + "default": "Modal" + }, + "id": 2483545, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Modal", + "nameStyleModule": "ModalComponent", + "modulePath": "react-bootstrap/Modal" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Modal.Header", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Modal", + "default": "Modal" + }, + "id": 9673748, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Modal.Header", + "nameStyleModule": "Modal.Header", + "modulePath": "react-bootstrap/Modal" + }, + { + "type": "component", + "subtype": "external-component", + "name": "Modal.Body", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/Modal", + "default": "Modal" + }, + "id": 9153689, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "Modal.Body", + "nameStyleModule": "Modal.Body", + "modulePath": "react-bootstrap/Modal" + }, + { + "type": "component", + "name": "Settings Billing", + "children": [ + { + "type": "instance", + "componentId": 4298867, + "id": 949964, + "attributes": "{\n\tstyle: {\n height: \"50px\"\n }\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "style", + "value": "{\nheight: \"50px\"\n}", + "isString": false, + "type": "ObjectExpression" + } + ] + } + ], + "code": " \tconst router = useRouter();\n\tconst auth = useAuth();\n\n\tuseEffect(() => {\n if (auth.user.planIsActive){\n // If user has an active plan then \n // take them to Stripe billing\n \tredirectToBilling();\n }else{\n // Otherwise go to pricing so they can\n // purchase a plan\n router.push('/pricing');\n }\n }, [auth.user.planId]);\n", + "id": 7876694, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "nameFormatted": "SettingsBilling", + "nameStyleModule": "SettingsBilling", + "modulePath": "src/components/SettingsBilling" + }, + { + "type": "component", + "subtype": "external-component", + "name": "ListGroup.Item", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/ListGroup", + "default": "ListGroup" + }, + "id": 2718339, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "ListGroup.Item", + "nameStyleModule": "ListGroup.Item", + "modulePath": "react-bootstrap/ListGroup" + }, + { + "type": "component", + "subtype": "external-component", + "name": "ListGroup", + "module": { + "moduleName": "react-bootstrap", + "modulePath": "react-bootstrap/ListGroup", + "default": "ListGroup" + }, + "id": 6820673, + "isVisible": true, + "nameLibrary": "", + "description": "", + "tags": [], + "children": [], + "nameFormatted": "ListGroup", + "nameStyleModule": "ListGroup", + "modulePath": "react-bootstrap/ListGroup" + }, + { + "id": "app", + "type": "component", + "subtype": "app-component", + "globalStyle": "// COLORS\n$theme-colors: (\n \"primary\": #0074d9,\n \"secondary\": #6c757d,\n \"success\": #28a745,\n \"danger\": #ff4136,\n \"warning\": #ffc107,\n \"info\": #17a2b8,\n \"light\": #f8f9fa,\n \"dark\": #343a40,\n \"white\": #ffffff,\n \"transparent\": transparent\n);\n\n// TEXT\n$font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n$font-family-base: $font-family-sans-serif;\n$font-size-base: 1rem;\n\n// BREAKPOINTS\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n);\n\n// SEE DOCS FOR MORE:\n// https://bit.ly/2sgFMdb\n\n// IMPORT BOOTSTRAP\n@import \"~bootstrap/scss/bootstrap\";", + "children": [ + { + "type": "instance", + "componentId": 7907106, + "id": 4920718, + "attributes": "{\n // Background color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"white\",\n // light, dark\n variant: \"light\",\n // Collapse at breakpoint\n // sm, md, lg\n expand: \"md\",\n\t// Logo image url\n logo: \"https://uploads.divjoy.com/logo.svg\"\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "white", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "variant", + "value": "light", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "expand", + "value": "md", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "logo", + "value": "https://uploads.divjoy.com/logo.svg", + "isString": true, + "type": "StringLiteral" + } + ] + }, + { + "type": "pages", + "id": 7948419, + "isVisible": true, + "children": [ + { + "type": "instance", + "subtype": "page-instance", + "componentId": 8064060, + "id": 183135, + "isVisible": true, + "children": [] + }, + { + "type": "instance", + "subtype": "page-instance", + "componentId": 6317044, + "id": 8028326, + "isVisible": true, + "children": [] + }, + { + "type": "instance", + "subtype": "page-instance", + "componentId": 4387217, + "id": 9787433, + "isVisible": true, + "children": [] + }, + { + "type": "instance", + "subtype": "page-instance", + "componentId": 2640204, + "id": 7308841, + "isVisible": true, + "children": [] + }, + { + "type": "instance", + "subtype": "page-instance", + "componentId": 9042429, + "id": 1270034, + "isVisible": true, + "children": [] + }, + { + "type": "instance", + "subtype": "page-instance", + "componentId": 5150340, + "id": 5439837, + "isVisible": true, + "children": [] + }, + { + "type": "instance", + "subtype": "page-instance", + "componentId": 5450495, + "id": 4009605, + "isVisible": true, + "children": [] + } + ] + }, + { + "type": "instance", + "componentId": 4644163, + "id": 9156080, + "attributes": "{\n // Background and text color\n // primary, secondary, success, danger,\n // warning, info, white, light, dark\n bg: \"light\",\n textColor: \"dark\",\n // sm, md, lg\n size: \"sm\",\n // Background image URL\n bgImage: \"\",\n // Background image opacity (0-1)\n bgImageOpacity: 1,\n\t// Text content\n description: 'A short description of what you do here',\n copyright: '© 2019 Company',\n // Logo image URL\n logo: 'https://uploads.divjoy.com/logo.svg',\n}", + "isVisible": true, + "children": [], + "propsArray": [ + { + "key": "bg", + "value": "light", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "textColor", + "value": "dark", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "size", + "value": "sm", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImage", + "value": "", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "bgImageOpacity", + "value": "1", + "isString": false, + "type": "NumericLiteral" + }, + { + "key": "description", + "value": "A short description of what you do here", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "copyright", + "value": "© 2019 Company", + "isString": true, + "type": "StringLiteral" + }, + { + "key": "logo", + "value": "https://uploads.divjoy.com/logo.svg", + "isString": true, + "type": "StringLiteral" + } + ] + } + ], + "isVisible": true, + "code": "", + "nameFormatted": "App", + "nameStyleModule": "App", + "modulePath": "src/pages/_app" + } + ] +} \ No newline at end of file diff --git a/firestore.rules b/firestore.rules new file mode 100644 index 0000000..9b1f79a --- /dev/null +++ b/firestore.rules @@ -0,0 +1,70 @@ +rules_version = '2'; +service cloud.firestore { + match /databases/{database}/documents { + match /users/{uid} { + + // Keys that user should not be able to update themself + function protected() { + return [ + 'admin', + 'stripeSubscriptionId', + 'stripePriceId', + 'stripeSubscriptionStatus' + ]; + } + + // Extend to add any extra validation logic you need here + // Right now it just ensures user cannot change protected keys defined above + function createIsValid() { + let hasProtectedKeys = futureData().keys().hasAny(protected()); + return hasProtectedKeys == false; + } + + function updateIsValid() { + let affectedKeys = futureData().diff(currentData()).affectedKeys(); + let hasProtectedKeys = affectedKeys.hasAny(protected()); + return hasProtectedKeys == false; + } + + allow read: if isUser(uid); + allow delete: if false; + allow create: if isUser(uid) && createIsValid(); + allow update: if isUser(uid) && updateIsValid(); + } + + match /items/{id} { + allow read: if true; + //allow read: if isOwner(); // Would restrict reads to just the item owner + allow delete: if isOwner(); + allow update: if isOwner() && willBeOwner(); + allow create: if willBeOwner(); + } + } +} + +// Helper functions that simplify our rules + +// Check if authenticated user has the specified uid +function isUser(uid) { + return request.auth.uid != null && request.auth.uid == uid; +} + +// Check if user matches current data owner +function isOwner(){ + return isUser(currentData().owner); +} + +// Check if user matches potential future data owner +function willBeOwner(){ + return isUser(futureData().owner); +} + +// Get current data +function currentData() { + return resource.data; +} + +// Get future state of data if write were accepted +function futureData() { + return request.resource.data; +} \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 085bdd5..0000000 --- a/index.html +++ /dev/null @@ -1,40 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Locali</title> -<style> - @font-face { - font-family: 'Reckt'; - font-style: normal; - font-weight: 400; - src: url('./dist/fonts/Recoleta-Regular.ttf'); /* IE9 Compat Modes / - src: local('Open Sans'), local('OpenSans'), - url('../fonts/open-sans-v13-latin-regular.eot?#iefix') format('embedded-opentype'), / IE6-IE8 / - url('../fonts/open-sans-v13-latin-regular.woff2') format('woff2'), / Super Modern Browsers / - url('../fonts/open-sans-v13-latin-regular.woff') format('woff'), / Modern Browsers / - url('../fonts/open-sans-v13-latin-regular.ttf') format('truetype'), / Safari, Android, iOS / - url('../fonts/open-sans-v13-latin-regular.svg#OpenSans') format('svg'); / Legacy iOS */ - } - @font-face { - font-family: 'Reckt'; - font-style: normal; - font-weight: 500; - src: url('./dist/fonts/Recoleta-Bold.ttf'); /* IE9 Compat Modes / - src: local('Open Sans'), local('OpenSans'), - url('../fonts/open-sans-v13-latin-regular.eot?#iefix') format('embedded-opentype'), / IE6-IE8 / - url('../fonts/open-sans-v13-latin-regular.woff2') format('woff2'), / Super Modern Browsers / - url('../fonts/open-sans-v13-latin-regular.woff') format('woff'), / Modern Browsers / - url('../fonts/open-sans-v13-latin-regular.ttf') format('truetype'), / Safari, Android, iOS / - url('../fonts/open-sans-v13-latin-regular.svg#OpenSans') format('svg'); / Legacy iOS */ - } -</style> - -</head> -<body> - <div id="app"></div> - <script type="text/javascript" src="/dist/main.js"></script> - -</body> -</html> \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c74c16f..0000000 --- a/package-lock.json +++ /dev/null @@ -1,8663 +0,0 @@ -{ - "name": "locali", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", - "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.10.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", - "dev": true, - "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", - "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" - } - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@material-ui/core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.0.tgz", - "integrity": "sha512-bYo9uIub8wGhZySHqLQ833zi4ZML+XCBE1XwJ8EuUVSpTWWG57Pm+YugQToJNFsEyiKFhPh8DPD0bgupz8n01g==", - "requires": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.10.0", - "@material-ui/system": "^4.9.14", - "@material-ui/types": "^5.1.0", - "@material-ui/utils": "^4.10.2", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0", - "react-transition-group": "^4.4.0" - } - }, - "@material-ui/icons": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz", - "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==", - "requires": { - "@babel/runtime": "^7.4.4" - } - }, - "@material-ui/styles": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.10.0.tgz", - "integrity": "sha512-XPwiVTpd3rlnbfrgtEJ1eJJdFCXZkHxy8TrdieaTvwxNYj42VnnCyFzxYeNW9Lhj4V1oD8YtQ6S5Gie7bZDf7Q==", - "requires": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "^5.1.0", - "@material-ui/utils": "^4.9.6", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.0.3", - "jss-plugin-camel-case": "^10.0.3", - "jss-plugin-default-unit": "^10.0.3", - "jss-plugin-global": "^10.0.3", - "jss-plugin-nested": "^10.0.3", - "jss-plugin-props-sort": "^10.0.3", - "jss-plugin-rule-value-function": "^10.0.3", - "jss-plugin-vendor-prefixer": "^10.0.3", - "prop-types": "^15.7.2" - } - }, - "@material-ui/system": { - "version": "4.9.14", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.14.tgz", - "integrity": "sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w==", - "requires": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.9.6", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - } - }, - "@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" - }, - "@material-ui/utils": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz", - "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==", - "requires": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/react": { - "version": "16.9.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.46.tgz", - "integrity": "sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg==", - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" - } - } - }, - "@types/react-transition-group": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", - "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", - "requires": { - "@types/react": "*" - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001114", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001114.tgz", - "integrity": "sha512-ml/zTsfNBM+T1+mjglWRPgVsu2L76GAaADKX5f4t0pbhttEp0WMawJsHDYlFkVZkoA+89uvBRrVrEE4oqenzXQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-loader": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.1.tgz", - "integrity": "sha512-MoqmF1if7Z0pZIEXA4ZF9PgtCXxWbfzfJM+3p+OYfhcrwcqhaCRb74DSnfzRl7e024xEiCRn5hCvfUbTf2sgFA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^7.3.2" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "requires": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.13.tgz", - "integrity": "sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.533", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz", - "integrity": "sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A==", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "file-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", - "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "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" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.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": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jss": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.4.0.tgz", - "integrity": "sha512-l7EwdwhsDishXzqTc3lbsbyZ83tlUl5L/Hb16pHCvZliA9lRDdNBZmHzeJHP0sxqD0t1mrMmMR8XroR12JBYzw==", - "requires": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" - } - } - }, - "jss-plugin-camel-case": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.4.0.tgz", - "integrity": "sha512-9oDjsQ/AgdBbMyRjc06Kl3P8lDCSEts2vYZiPZfGAxbGCegqE4RnMob3mDaBby5H9vL9gWmyyImhLRWqIkRUCw==", - "requires": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.4.0" - } - }, - "jss-plugin-default-unit": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.4.0.tgz", - "integrity": "sha512-BYJ+Y3RUYiMEgmlcYMLqwbA49DcSWsGgHpVmEEllTC8MK5iJ7++pT9TnKkKBnNZZxTV75ycyFCR5xeLSOzVm4A==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.4.0" - } - }, - "jss-plugin-global": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.4.0.tgz", - "integrity": "sha512-b8IHMJUmv29cidt3nI4bUI1+Mo5RZE37kqthaFpmxf5K7r2aAegGliAw4hXvA70ca6ckAoXMUl4SN/zxiRcRag==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.4.0" - } - }, - "jss-plugin-nested": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.4.0.tgz", - "integrity": "sha512-cKgpeHIxAP0ygeWh+drpLbrxFiak6zzJ2toVRi/NmHbpkNaLjTLgePmOz5+67ln3qzJiPdXXJB1tbOyYKAP4Pw==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.4.0", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-props-sort": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.4.0.tgz", - "integrity": "sha512-j/t0R40/2fp+Nzt6GgHeUFnHVY2kPGF5drUVlgkcwYoHCgtBDOhTTsOfdaQFW6sHWfoQYgnGV4CXdjlPiRrzwA==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.4.0" - } - }, - "jss-plugin-rule-value-function": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.4.0.tgz", - "integrity": "sha512-w8504Cdfu66+0SJoLkr6GUQlEb8keHg8ymtJXdVHWh0YvFxDG2l/nS93SI5Gfx0fV29dO6yUugXnKzDFJxrdFQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.4.0", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-vendor-prefixer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.4.0.tgz", - "integrity": "sha512-DpF+/a+GU8hMh/948sBGnKSNfKkoHg2p9aRFUmyoyxgKjOeH9n74Ht3Yt8lOgdZsuWNJbPrvaa3U4PXKwxVpTQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.4.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klona": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/klona/-/klona-1.1.2.tgz", - "integrity": "sha512-xf88rTeHiXk+XE2Vhi6yj8Wm3gMZrygGdKjJqN8HkV+PwF/t50/LdAKHoHpPcxFAlmQszTZ1CugrK25S7qDRLA==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mini-create-react-context": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", - "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "tiny-warning": "^1.0.3" - } - }, - "mini-css-extract-plugin": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz", - "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "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 - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", - "dev": true - }, - "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "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 - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "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 - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.26.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", - "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", - "dev": true, - "requires": { - "chokidar": ">=2.0.0 <4.0.0" - } - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - } - }, - "sass-loader": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-9.0.3.tgz", - "integrity": "sha512-fOwsP98ac1VMme+V3+o0HaaMHp8Q/C9P+MUazLFVi3Jl7ORGHQXL1XeRZt3zLSGZQQPC8xE42Y2WptItvGjDQg==", - "dev": true, - "requires": { - "klona": "^1.1.2", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^2.7.0", - "semver": "^7.3.2" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "style-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", - "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "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": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==", - "dev": true - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", - "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "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" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - } - } -} diff --git a/package.json b/package.json index 1d45a61..d5fa795 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,51 @@ { - "name": "locali", - "version": "1.0.0", - "description": "Govhack 2020", - "main": "index.js", + "name": "my-divjoy-project", + "version": "0.1.0", + "private": true, + "keywords": [ + "divjoy" + ], + "dependencies": { + "react": "16.12.0", + "react-dom": "16.12.0", + "react-router-dom": "5.1.2", + "react-router-bootstrap": "0.25.0", + "react-scripts": "3.4.1", + "node-sass": "4.13.0", + "react-hook-form": "4.10.1", + "react-bootstrap": "1.0.0-beta.16", + "bootstrap": "4.4.1", + "query-string": "6.9.0", + "firebase": "7.15.1", + "mailchimp-api-v3": "1.13.1", + "@stripe/stripe-js": "^1.5.0", + "stripe": "^8.52.0", + "firebase-admin": "8.12.1", + "raw-body": "^2.4.1", + "analytics": "0.3.1", + "@analytics/google-analytics": "0.2.2" + }, "scripts": { - "start": "webpack-dev-server --progress --colors", - "build": "webpack --progress" + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "dev": "BROWSER=none react-scripts start", + "stripe-webhook": "stripe listen --forward-to localhost:3000/api/stripe-webhook" }, - "author": "Big Sunday", - "license": "ISC", - "devDependencies": { - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/preset-react": "^7.10.4", - "babel-loader": "^8.1.0", - "css-loader": "^4.2.1", - "file-loader": "^6.0.0", - "mini-css-extract-plugin": "^0.10.0", - "node-sass": "^4.14.1", - "prop-types": "^15.7.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-router-dom": "^5.2.0", - "sass": "^1.26.10", - "sass-loader": "^9.0.3", - "style-loader": "^1.2.1", - "webpack": "^4.44.1", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0" + "eslintConfig": { + "extends": "react-app" }, - "dependencies": { - "@material-ui/core": "^4.11.0", - "@material-ui/icons": "^4.9.1" + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] } -} +} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..dd1ccfd --- /dev/null +++ b/public/index.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta name="theme-color" content="#000000" /> + <!-- + manifest.json provides metadata used when your web app is installed on a + user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ + --> + <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> + <!-- + Notice the use of %PUBLIC_URL% in the tags above. + It will be replaced with the URL of the `public` folder during the build. + Only files inside the `public` folder can be referenced from the HTML. + + Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will + work correctly both with client-side routing and a non-root public URL. + Learn how to configure a non-root public URL by running `npm run build`. + --> + <title>React App</title> + </head> + <body> + <noscript>You need to enable JavaScript to run this app.</noscript> + <div id="root"></div> + <!-- + This HTML file is a template. + If you open it directly in the browser, you will see an empty page. + + You can add webfonts, meta tags, or analytics to this file. + The build step will place the bundled scripts into the <body> tag. + + To begin the development, run `npm start` or `yarn start`. + To create a production bundle, use `npm run build` or `yarn build`. + --> + </body> +</html> diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..c4e4f94 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} \ No newline at end of file diff --git a/src/components/Auth.js b/src/components/Auth.js new file mode 100644 index 0000000..896697e --- /dev/null +++ b/src/components/Auth.js @@ -0,0 +1,63 @@ +import React, { useState } from "react"; +import FormAlert from "./FormAlert"; +import AuthForm from "./AuthForm"; +import AuthSocial from "./AuthSocial"; +import AuthFooter from "./AuthFooter"; +import { useRouter } from "./../util/router.js"; + +function Auth(props) { + const router = useRouter(); + const [formAlert, setFormAlert] = useState(null); + + const handleAuth = (user) => { + router.push(props.afterAuthPath); + }; + + const handleFormAlert = (data) => { + setFormAlert(data); + }; + + return ( + <> + {formAlert && ( + <FormAlert type={formAlert.type} message={formAlert.message} /> + )} + + <AuthForm + type={props.type} + typeValues={props.typeValues} + inputSize={props.inputSize} + onAuth={handleAuth} + onFormAlert={handleFormAlert} + /> + + {["signup", "signin"].includes(props.type) && ( + <> + {props.providers && props.providers.length && ( + <> + <small className="text-center d-block my-3">OR</small> + <AuthSocial + type={props.type} + buttonText={props.typeValues.buttonText} + inputSize={props.inputSize} + providers={props.providers} + showLastUsed={true} + onAuth={handleAuth} + onError={(message) => { + handleFormAlert({ + type: "error", + message: message, + }); + }} + /> + </> + )} + + <AuthFooter type={props.type} typeValues={props.typeValues} /> + </> + )} + </> + ); +} + +export default Auth; diff --git a/src/components/AuthFooter.js b/src/components/AuthFooter.js new file mode 100644 index 0000000..f0f1804 --- /dev/null +++ b/src/components/AuthFooter.js @@ -0,0 +1,27 @@ +import React from "react"; +import { Link } from "./../util/router.js"; +import "./AuthFooter.scss"; + +function AuthFooter(props) { + return ( + <div className="AuthFooter text-center mt-4"> + {props.type === "signup" && ( + <> + Have an account already? + <Link to="/auth/signin">{props.typeValues.linkTextSignin}</Link> + </> + )} + + {props.type === "signin" && ( + <> + <Link to="/auth/signup">{props.typeValues.linkTextSignup}</Link> + <Link to="/auth/forgotpass"> + {props.typeValues.linkTextForgotpass} + </Link> + </> + )} + </div> + ); +} + +export default AuthFooter; diff --git a/src/components/AuthFooter.scss b/src/components/AuthFooter.scss new file mode 100644 index 0000000..20db86b --- /dev/null +++ b/src/components/AuthFooter.scss @@ -0,0 +1,6 @@ +.AuthFooter { + font-size: 0.9rem; + a { + margin: 0 0.5rem; + } +} diff --git a/src/components/AuthForm.js b/src/components/AuthForm.js new file mode 100644 index 0000000..8198411 --- /dev/null +++ b/src/components/AuthForm.js @@ -0,0 +1,150 @@ +import React, { useState } from "react"; +import Form from "react-bootstrap/Form"; +import FormField from "./FormField"; +import Button from "react-bootstrap/Button"; +import Spinner from "react-bootstrap/Spinner"; +import { useAuth } from "./../util/auth.js"; +import { useForm } from "react-hook-form"; + +function AuthForm(props) { + const auth = useAuth(); + + const [pending, setPending] = useState(false); + const { handleSubmit, register, errors, getValues } = useForm(); + + const submitHandlersByType = { + signin: ({ email, pass }) => { + return auth.signin(email, pass).then((user) => { + // Call auth complete handler + props.onAuth(user); + }); + }, + signup: ({ email, pass }) => { + return auth.signup(email, pass).then((user) => { + // Call auth complete handler + props.onAuth(user); + }); + }, + forgotpass: ({ email }) => { + return auth.sendPasswordResetEmail(email).then(() => { + // Show success alert message + props.onFormAlert({ + type: "success", + message: "Password reset email sent", + }); + }); + }, + changepass: ({ pass }) => { + return auth.confirmPasswordReset(pass).then(() => { + // Show success alert message + props.onFormAlert({ + type: "success", + message: "Your password has been changed", + }); + }); + }, + }; + + // Handle form submission + const onSubmit = ({ email, pass }) => { + // Show pending indicator + setPending(true); + + // Call submit handler for auth type + submitHandlersByType[props.type]({ + email, + pass, + }) + .catch((error) => { + // Show error alert message + props.onFormAlert({ + type: "error", + message: error.message, + }); + }) + .finally(() => { + // Hide pending indicator + setPending(false); + }); + }; + + return ( + <Form onSubmit={handleSubmit(onSubmit)}> + {["signup", "signin", "forgotpass"].includes(props.type) && ( + <Form.Group controlId="formEmail"> + <FormField + size={props.inputSize} + name="email" + type="email" + placeholder="Email" + error={errors.email} + inputRef={register({ + required: "Please enter an email", + })} + /> + </Form.Group> + )} + + {["signup", "signin", "changepass"].includes(props.type) && ( + <Form.Group controlId="formPassword"> + <FormField + size={props.inputSize} + name="pass" + type="password" + placeholder="Password" + error={errors.pass} + inputRef={register({ + required: "Please enter a password", + })} + /> + </Form.Group> + )} + + {["signup", "changepass"].includes(props.type) && ( + <Form.Group controlId="formConfirmPass"> + <FormField + size={props.inputSize} + name="confirmPass" + type="password" + placeholder="Confirm Password" + error={errors.confirmPass} + inputRef={register({ + required: "Please enter your password again", + validate: (value) => { + if (value === getValues().pass) { + return true; + } else { + return "This doesn't match your password"; + } + }, + })} + /> + </Form.Group> + )} + + <Button + variant="primary" + block={true} + size={props.inputSize} + type="submit" + disabled={pending} + > + {!pending && <span>{props.typeValues.buttonText}</span>} + + {pending && ( + <Spinner + animation="border" + size="sm" + role="status" + aria-hidden={true} + className="align-baseline" + > + <span className="sr-only">Loading...</span> + </Spinner> + )} + </Button> + </Form> + ); +} + +export default AuthForm; diff --git a/src/components/AuthSection.js b/src/components/AuthSection.js new file mode 100644 index 0000000..70f5164 --- /dev/null +++ b/src/components/AuthSection.js @@ -0,0 +1,73 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import Auth from "./Auth"; + +function AuthSection(props) { + // Values for each auth type + const allTypeValues = { + signin: { + // Top title + title: "Welcome back", + // Submit button text + buttonText: "Sign in", + // Link text to other auth types + linkTextSignup: "Create an account", + linkTextForgotpass: "Forgot Password?", + }, + signup: { + title: "Get yourself an account", + buttonText: "Sign up", + linkTextSignin: "Sign in", + }, + forgotpass: { + title: "Get a new password", + buttonText: "Reset password", + }, + changepass: { + title: "Choose a new password", + buttonText: "Change password", + }, + }; + + // Ensure we have a valid auth type + const currentType = allTypeValues[props.type] ? props.type : "signup"; + + // Get values for current auth type + const typeValues = allTypeValues[currentType]; + + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container + style={{ + maxWidth: "450px", + }} + > + <SectionHeader + title={allTypeValues[currentType].title} + subtitle="" + size={2} + spaced={true} + className="text-center" + /> + <Auth + type={currentType} + typeValues={typeValues} + inputSize={props.inputSize} + providers={props.providers} + afterAuthPath={props.afterAuthPath} + key={currentType} + /> + </Container> + </Section> + ); +} + +export default AuthSection; diff --git a/src/components/AuthSocial.js b/src/components/AuthSocial.js new file mode 100644 index 0000000..1c6186a --- /dev/null +++ b/src/components/AuthSocial.js @@ -0,0 +1,103 @@ +import React, { useEffect, useState } from "react"; +import Button from "react-bootstrap/Button"; +import Spinner from "react-bootstrap/Spinner"; +import Badge from "react-bootstrap/Badge"; +import { useAuth } from "./../util/auth.js"; +import "./AuthSocial.scss"; + +function AuthSocial(props) { + const auth = useAuth(); + const [pending, setPending] = useState(null); + const [lastUsed, setLastUsed] = useState(null); + + const providerDisplayNames = { + google: "Google", + facebook: "Facebook", + twitter: "Twitter", + github: "GitHub", + }; + + const onSigninWithProvider = (provider) => { + setPending(provider); + auth + .signinWithProvider(provider) + .then((user) => { + localStorage.setItem("lastUsedAuthProvider", provider); + props.onAuth(user); + }) + .catch((error) => { + props.onError(error.message); + }) + .finally(() => { + setPending(null); + }); + }; + + // Get value of last used auth provider + useEffect(() => { + if (props.showLastUsed) { + const lastUsed = window.localStorage.getItem("lastUsedAuthProvider"); + if (lastUsed) { + setLastUsed(lastUsed); + } + } + }, [props.showLastUsed]); + + return ( + <> + {props.providers.map((provider) => ( + <Button + variant="light" + size={props.inputSize} + block={true} + onClick={() => { + onSigninWithProvider(provider); + }} + className="position-relative" + key={provider} + > + <div className="AuthSocial__icon"> + <img + src={`https://uploads.divjoy.com/icon-${provider}.svg`} + alt={providerDisplayNames[provider]} + /> + </div> + + {pending !== provider && ( + <span> + {props.buttonText} with {providerDisplayNames[provider]} + </span> + )} + + {pending === provider && ( + <Spinner + animation="border" + size="sm" + role="status" + aria-hidden={true} + className="align-baseline text-primary" + > + <span className="sr-only">Loading...</span> + </Spinner> + )} + + {provider === lastUsed && ( + <Badge + variant="warning" + className="position-absolute font-weight-normal" + style={{ + top: "-6px", + right: "-6px", + opacity: 0.7, + }} + > + Last used + </Badge> + )} + </Button> + ))} + </> + ); +} + +export default AuthSocial; diff --git a/src/components/AuthSocial.scss b/src/components/AuthSocial.scss new file mode 100644 index 0000000..0aace0e --- /dev/null +++ b/src/components/AuthSocial.scss @@ -0,0 +1,15 @@ +.AuthSocial { + &__icon { + position: absolute; + align-items: center; + display: inline-flex; + justify-content: center; + width: 1.5em; + height: 1.5em; + left: 0.5em; + img { + display: block; + width: 20px; + } + } +} diff --git a/src/components/Avatar.js b/src/components/Avatar.js new file mode 100644 index 0000000..f48d41b --- /dev/null +++ b/src/components/Avatar.js @@ -0,0 +1,19 @@ +import React from "react"; +import Image from "react-bootstrap/Image"; + +function Avatar(props) { + const { size, ...otherProps } = props; + + return ( + <Image + {...otherProps} + roundedCircle={true} + style={{ + width: size, + height: size, + }} + /> + ); +} + +export default Avatar; diff --git a/src/components/BackgroundImage.js b/src/components/BackgroundImage.js new file mode 100644 index 0000000..756b5d8 --- /dev/null +++ b/src/components/BackgroundImage.js @@ -0,0 +1,16 @@ +import React from "react"; +import "./BackgroundImage.scss"; + +function BackgroundImage(props) { + return ( + <div + className={"BackgroundImage" + (props.repeat ? " repeat" : "")} + style={{ + "--image": `url(${props.image})`, + "--opacity": props.opacity, + }} + /> + ); +} + +export default BackgroundImage; diff --git a/src/components/BackgroundImage.scss b/src/components/BackgroundImage.scss new file mode 100644 index 0000000..212ffd6 --- /dev/null +++ b/src/components/BackgroundImage.scss @@ -0,0 +1,23 @@ +.BackgroundImage { + // Set using CSS vars defined + // in element inline style. + background-image: var(--image); + opacity: var(--opacity); + // Fill parent container + background-position: center center; + background-size: cover; + top: 0; + left: 0; + bottom: 0; + right: 0; + position: absolute; + // Place under other elements + z-index: 0; + + // Make it a repeating pattern + &.repeat { + background-size: auto; + background-position: 0% 0%; + background-repeat: true; + } +} diff --git a/src/components/Contact.js b/src/components/Contact.js new file mode 100644 index 0000000..3a3dd8b --- /dev/null +++ b/src/components/Contact.js @@ -0,0 +1,123 @@ +import React, { useState } from "react"; +import FormAlert from "./FormAlert"; +import Form from "react-bootstrap/Form"; +import Col from "react-bootstrap/Col"; +import FormField from "./FormField"; +import Button from "react-bootstrap/Button"; +import Spinner from "react-bootstrap/Spinner"; +import contact from "./../util/contact.js"; +import { useForm } from "react-hook-form"; + +function Contact(props) { + const [pending, setPending] = useState(false); + const [formAlert, setFormAlert] = useState(null); + const { handleSubmit, register, errors, reset } = useForm(); + + const onSubmit = (data) => { + // Show pending indicator + setPending(true); + + contact + .submit(data) + .then(() => { + // Clear form + reset(); + // Show success alert message + setFormAlert({ + type: "success", + message: "Your message has been sent!", + }); + }) + .catch((error) => { + // Show error alert message + setFormAlert({ + type: "error", + message: error.message, + }); + }) + .finally(() => { + // Hide pending indicator + setPending(false); + }); + }; + + return ( + <> + {formAlert && ( + <FormAlert type={formAlert.type} message={formAlert.message} /> + )} + + <Form onSubmit={handleSubmit(onSubmit)}> + <Form.Row> + {props.showNameField && ( + <Form.Group as={Col} xs={12} sm={6} controlId="formName"> + <FormField + size={props.inputSize} + name="name" + type="text" + placeholder="Name" + error={errors.name} + inputRef={register({ + required: "Please enter your name", + })} + /> + </Form.Group> + )} + + <Form.Group + as={Col} + xs={12} + sm={props.showNameField ? 6 : 12} + controlId="formEmail" + > + <FormField + size={props.inputSize} + name="email" + type="email" + placeholder="Email" + error={errors.email} + inputRef={register({ + required: "Please enter your email", + })} + /> + </Form.Group> + </Form.Row> + <Form.Group controlId="formMessage"> + <FormField + size={props.inputSize} + name="message" + type="textarea" + placeholder="Message" + rows={5} + error={errors.message} + inputRef={register({ + required: "Please enter a message", + })} + /> + </Form.Group> + <Button + variant={props.buttonColor} + size={props.inputSize} + type="submit" + disabled={pending} + > + <span>{props.buttonText}</span> + + {pending && ( + <Spinner + animation="border" + size="sm" + role="status" + aria-hidden={true} + className="ml-2" + > + <span className="sr-only">Sending...</span> + </Spinner> + )} + </Button> + </Form> + </> + ); +} + +export default Contact; diff --git a/src/components/ContactSection.js b/src/components/ContactSection.js new file mode 100644 index 0000000..a2b5149 --- /dev/null +++ b/src/components/ContactSection.js @@ -0,0 +1,39 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import Contact from "./Contact"; + +function ContactSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container + style={{ + maxWidth: "850px", + }} + > + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={2} + spaced={true} + className="text-center" + /> + <Contact + showNameField={props.showNameField} + buttonText={props.buttonText} + buttonColor={props.buttonColor} + inputSize={props.inputSize} + /> + </Container> + </Section> + ); +} + +export default ContactSection; diff --git a/src/components/DashboardSection.js b/src/components/DashboardSection.js new file mode 100644 index 0000000..3018884 --- /dev/null +++ b/src/components/DashboardSection.js @@ -0,0 +1,107 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import Alert from "react-bootstrap/Alert"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Image from "react-bootstrap/Image"; +import ListGroup from "react-bootstrap/ListGroup"; +import { Link, useRouter } from "./../util/router.js"; +import { useAuth } from "./../util/auth.js"; +import "./DashboardSection.scss"; + +function DashboardSection(props) { + const auth = useAuth(); + const router = useRouter(); + + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={1} + spaced={true} + className="text-center" + /> + + {router.query.paid && auth.user.planIsActive && ( + <Alert + variant="success" + className="text-center mx-auto" + style={{ maxWidth: "300px" }} + > + You are now subscribed 🥳 + </Alert> + )} + + <Row className="align-items-center mt-5"> + <Col lg={6}> + <p> + This would be a good place to build your custom product features + after exporting your codebase. + </p> + <p> + You can grab the current user, query your database, render custom + components, and anything else you'd like. + </p> + <p> + Divjoy sets you up with everything you need so that you can get + right to work on building your web app. + </p> + </Col> + <Col className="mt-5 mt-lg-0"> + <figure className="DashboardSection__image-container mx-auto"> + <Image + src="https://uploads.divjoy.com/undraw-personal_settings_kihd.svg" + fluid={true} + /> + </figure> + </Col> + </Row> + <div + className="mt-5 mx-auto text-center" + style={{ + maxWidth: "460px", + }} + > + <small>Some helpful debug info 🐛</small> + <ListGroup className="mt-2"> + <ListGroup.Item> + Logged in as <strong>{auth.user.email}</strong> + </ListGroup.Item> + <ListGroup.Item> + {auth.user.stripeSubscriptionId && ( + <> + Subscription data + <br /> + ID: <strong>{auth.user.stripeSubscriptionId}</strong> + <br /> + Price ID: <strong>{auth.user.stripePriceId}</strong> + <br /> + Status: <strong>{auth.user.stripeSubscriptionStatus}</strong> + </> + )} + + {!auth.user.stripeSubscriptionId && ( + <Link to="/pricing">Subscribe to a plan</Link> + )} + </ListGroup.Item> + <ListGroup.Item> + <Link to="/settings/general">Account settings</Link> + </ListGroup.Item> + </ListGroup> + </div> + </Container> + </Section> + ); +} + +export default DashboardSection; diff --git a/src/components/DashboardSection.scss b/src/components/DashboardSection.scss new file mode 100644 index 0000000..97b3746 --- /dev/null +++ b/src/components/DashboardSection.scss @@ -0,0 +1,5 @@ +.DashboardSection { + &__image-container { + max-width: 370px; + } +} diff --git a/src/components/Faq.js b/src/components/Faq.js new file mode 100644 index 0000000..608792e --- /dev/null +++ b/src/components/Faq.js @@ -0,0 +1,14 @@ +import React from "react"; +import FaqItem from "./FaqItem"; + +function Faq(props) { + return ( + <> + {props.items.map((item, index) => ( + <FaqItem question={item.question} answer={item.answer} key={index} /> + ))} + </> + ); +} + +export default Faq; diff --git a/src/components/FaqItem.js b/src/components/FaqItem.js new file mode 100644 index 0000000..273ddcf --- /dev/null +++ b/src/components/FaqItem.js @@ -0,0 +1,27 @@ +import React, { useState } from "react"; +import "./FaqItem.scss"; + +function FaqItem(props) { + const [expanded, setExpanded] = useState(false); + + return ( + <article className="FaqItem py-4" onClick={() => setExpanded(!expanded)}> + <h4> + <span className="text-primary mr-3"> + <i + className={ + "fas" + + (expanded ? " fa-minus" : "") + + (!expanded ? " fa-plus" : "") + } + /> + </span> + {props.question} + </h4> + + {expanded && <div className="mt-3">{props.answer}</div>} + </article> + ); +} + +export default FaqItem; diff --git a/src/components/FaqItem.scss b/src/components/FaqItem.scss new file mode 100644 index 0000000..8108000 --- /dev/null +++ b/src/components/FaqItem.scss @@ -0,0 +1,7 @@ +.FaqItem { + cursor: pointer; + border-bottom: 1px solid #efefef; + &:last-child { + border-bottom: none; + } +} diff --git a/src/components/FaqSection.js b/src/components/FaqSection.js new file mode 100644 index 0000000..2bd810d --- /dev/null +++ b/src/components/FaqSection.js @@ -0,0 +1,58 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import Faq from "./Faq"; + +function FaqSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={2} + spaced={true} + className="text-center" + /> + <Faq + items={[ + { + question: "Integer ornare neque mauris?", + answer: + "Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.", + }, + { + question: "Lorem ipsum dolor sit amet?", + answer: + "Nunc nulla mauris, laoreet vel cursus lacinia, consectetur sit amet tellus. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.", + }, + { + question: "Suspendisse ut tincidunt?", + answer: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lobortis, metus et mattis ullamcorper. Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.", + }, + { + question: "Ut enim ad minim veniam?", + answer: + "Suspendisse ut tincidunt eros. In velit mi, rhoncus dictum neque a, tincidunt lobortis justo.", + }, + { + question: "In velit mi, rhoncus dictum neque?", + answer: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.", + }, + ]} + /> + </Container> + </Section> + ); +} + +export default FaqSection; diff --git a/src/components/Features.js b/src/components/Features.js new file mode 100644 index 0000000..4da76c7 --- /dev/null +++ b/src/components/Features.js @@ -0,0 +1,33 @@ +import React from "react"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import SectionHeader from "./SectionHeader"; +import Image from "react-bootstrap/Image"; +import "./Features.scss"; + +function Features(props) { + return ( + <div className="Features"> + {props.items.map((item, index) => ( + <Row className="align-items-center" key={index}> + <Col xs={12} lg={6}> + <SectionHeader + title={item.title} + subtitle={item.description} + spaced={true} + size={3} + className="text-center text-lg-left" + /> + </Col> + <Col> + <figure className="Features__image-container"> + <Image src={item.image} alt={item.title} fluid={true} /> + </figure> + </Col> + </Row> + ))} + </div> + ); +} + +export default Features; diff --git a/src/components/Features.scss b/src/components/Features.scss new file mode 100644 index 0000000..377bde4 --- /dev/null +++ b/src/components/Features.scss @@ -0,0 +1,23 @@ +.Features { + max-width: 900px; + margin: 60px auto 0 auto; + + .row { + // Reverse every other row + &:nth-of-type(even) { + flex-direction: row-reverse; + } + + &:not(:last-of-type) { + padding-bottom: 1.5rem; + @media screen and (min-width: 769px) { + padding-bottom: 2.5rem; + } + } + } + + &__image-container { + max-width: 300px; + margin: 30px auto; + } +} diff --git a/src/components/FeaturesSection.js b/src/components/FeaturesSection.js new file mode 100644 index 0000000..a7e84b7 --- /dev/null +++ b/src/components/FeaturesSection.js @@ -0,0 +1,58 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import Features from "./Features"; + +function FeaturesSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={2} + spaced={true} + className="text-center" + /> + <Features + items={[ + { + title: "Explore", + description: + "Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.", + image: "https://uploads.divjoy.com/undraw-mind_map_cwng.svg", + }, + { + title: "Explore", + description: + "Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.", + image: + "https://uploads.divjoy.com/undraw-personal_settings_kihd.svg", + }, + { + title: "Explore", + description: + "Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.", + image: "https://uploads.divjoy.com/undraw-having_fun_iais.svg", + }, + { + title: "Explore", + description: + "Integer ornare neque mauris, ac vulputate lacus venenatis et. Pellentesque ut ultrices purus.", + image: "https://uploads.divjoy.com/undraw-balloons_vxx5.svg", + }, + ]} + /> + </Container> + </Section> + ); +} + +export default FeaturesSection; diff --git a/src/components/Footer.js b/src/components/Footer.js new file mode 100644 index 0000000..b4d8523 --- /dev/null +++ b/src/components/Footer.js @@ -0,0 +1,72 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import { Link } from "./../util/router.js"; +import "./Footer.scss"; + +function Footer(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + className="footer" + > + <Container> + <div className="FooterComponent__inner"> + <div className="brand left"> + <Link to="/"> + <img src={props.logo} alt="Logo" /> + </Link> + </div> + <div className="links right"> + <Link to="/about">About</Link> + <Link to="/faq">FAQ</Link> + <Link to="/contact">Contact</Link> + <a + target="_blank" + href="https://medium.com" + rel="noopener noreferrer" + > + Blog + </a> + </div> + <div className="social right"> + <a + href="https://twitter.com" + target="_blank" + rel="noopener noreferrer" + > + <span className="icon"> + <i className="fab fa-twitter" /> + </span> + </a> + <a + href="https://facebook.com" + target="_blank" + rel="noopener noreferrer" + > + <span className="icon"> + <i className="fab fa-facebook-f" /> + </span> + </a> + <a + href="https://instagram.com" + target="_blank" + rel="noopener noreferrer" + > + <span className="icon"> + <i className="fab fa-instagram" /> + </span> + </a> + </div> + <div className="copyright left">{props.copyright}</div> + </div> + </Container> + </Section> + ); +} + +export default Footer; diff --git a/src/components/Footer.scss b/src/components/Footer.scss new file mode 100644 index 0000000..932ad2c --- /dev/null +++ b/src/components/Footer.scss @@ -0,0 +1,59 @@ +.FooterComponent { + &__inner { + display: flex; + flex-wrap: wrap; + > div { + display: flex; + flex: none; + justify-content: center; + width: 100%; + margin-bottom: 24px; + } + + .brand { + img { + display: block; + height: 32px; + } + } + + .social { + align-items: flex-end; + } + + .social, + .links { + a { + color: inherit; + &:hover { + opacity: 0.8; + } + + &:not(:first-of-type) { + margin-left: 20px; + } + } + } + + // Tablet and up + @media screen and (min-width: 768px) { + > div { + flex: 50%; + } + + .left { + justify-content: flex-start; + } + + .right { + justify-content: flex-end; + } + + // Move links to end (bottom right) + // Swaps position with social + .links { + order: 1; + } + } + } +} diff --git a/src/components/FormAlert.js b/src/components/FormAlert.js new file mode 100644 index 0000000..c5db813 --- /dev/null +++ b/src/components/FormAlert.js @@ -0,0 +1,13 @@ +import React from "react"; +import Alert from "react-bootstrap/Alert"; + +function FormAlert(props) { + const { type, message, ...otherProps } = props; + return ( + <Alert variant={type === "error" ? "danger" : "success"} {...otherProps}> + {message} + </Alert> + ); +} + +export default FormAlert; diff --git a/src/components/FormField.js b/src/components/FormField.js new file mode 100644 index 0000000..b59b31f --- /dev/null +++ b/src/components/FormField.js @@ -0,0 +1,28 @@ +import React from "react"; +import Form from "react-bootstrap/Form"; + +function FormField(props) { + const { error, type, inputRef, ...inputProps } = props; + + return ( + <> + {props.label && <Form.Label>{props.label}</Form.Label>} + + <Form.Control + as={type === "textarea" ? "textarea" : "input"} + type={type === "textarea" ? undefined : type} + isInvalid={error ? true : undefined} + ref={inputRef} + {...inputProps} + /> + + {error && ( + <Form.Control.Feedback type="invalid" className="text-left"> + {error.message} + </Form.Control.Feedback> + )} + </> + ); +} + +export default FormField; diff --git a/src/components/HeroSection.js b/src/components/HeroSection.js new file mode 100644 index 0000000..9bf70e3 --- /dev/null +++ b/src/components/HeroSection.js @@ -0,0 +1,48 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import SectionHeader from "./SectionHeader"; +import Button from "react-bootstrap/Button"; +import Image from "react-bootstrap/Image"; +import "./HeroSection.scss"; + +function HeroSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <Row className="align-items-center"> + <Col lg={5} className="text-center text-lg-left"> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={1} + spaced={true} + /> + <Button + variant={props.buttonColor} + size="lg" + onClick={props.buttonOnClick} + > + {props.buttonText} + </Button> + </Col> + <Col className="offset-lg-1 mt-5 mt-lg-0 "> + <figure className="HeroSection__image-container mx-auto"> + <Image src={props.image} fluid={true} /> + </figure> + </Col> + </Row> + </Container> + </Section> + ); +} + +export default HeroSection; diff --git a/src/components/HeroSection.scss b/src/components/HeroSection.scss new file mode 100644 index 0000000..e20b4c6 --- /dev/null +++ b/src/components/HeroSection.scss @@ -0,0 +1,5 @@ +.HeroSection { + &__image-container { + max-width: 570px; + } +} diff --git a/src/components/HeroSection2.js b/src/components/HeroSection2.js new file mode 100644 index 0000000..1c66855 --- /dev/null +++ b/src/components/HeroSection2.js @@ -0,0 +1,28 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; + +function HeroSection2(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={1} + spaced={true} + className="text-center" + /> + </Container> + </Section> + ); +} + +export default HeroSection2; diff --git a/src/components/NavbarCustom.js b/src/components/NavbarCustom.js new file mode 100644 index 0000000..1e0d083 --- /dev/null +++ b/src/components/NavbarCustom.js @@ -0,0 +1,70 @@ +import React from "react"; +import Navbar from "react-bootstrap/Navbar"; +import Container from "react-bootstrap/Container"; +import { LinkContainer } from "react-router-bootstrap"; +import Nav from "react-bootstrap/Nav"; +import NavDropdown from "react-bootstrap/NavDropdown"; +import Dropdown from "react-bootstrap/Dropdown"; +import { useAuth } from "./../util/auth.js"; + +function NavbarCustom(props) { + const auth = useAuth(); + + return ( + <Navbar bg={props.bg} variant={props.variant} expand={props.expand}> + <Container> + <LinkContainer to="/"> + <Navbar.Brand> + <img + className="d-inline-block align-top" + src={props.logo} + alt="Logo" + height="30" + /> + </Navbar.Brand> + </LinkContainer> + + <Navbar.Toggle aria-controls="navbar-nav" className="border-0" /> + <Navbar.Collapse id="navbar-nav" className="justify-content-end"> + <Nav> + {auth.user && ( + <NavDropdown id="dropdown" title="Account" alignRight={true}> + <LinkContainer to="/dashboard"> + <NavDropdown.Item active={false}>Dashboard</NavDropdown.Item> + </LinkContainer> + + <LinkContainer to="/settings/general"> + <NavDropdown.Item active={false}>Settings</NavDropdown.Item> + </LinkContainer> + + <Dropdown.Divider /> + + <LinkContainer to="/auth/signout"> + <NavDropdown.Item + active={false} + onClick={(e) => { + e.preventDefault(); + auth.signout(); + }} + > + Sign out + </NavDropdown.Item> + </LinkContainer> + </NavDropdown> + )} + + {!auth.user && ( + <Nav.Item> + <LinkContainer to="/auth/signin"> + <Nav.Link active={false}>Sign in</Nav.Link> + </LinkContainer> + </Nav.Item> + )} + </Nav> + </Navbar.Collapse> + </Container> + </Navbar> + ); +} + +export default NavbarCustom; diff --git a/src/components/Newsletter.js b/src/components/Newsletter.js new file mode 100644 index 0000000..0f8688d --- /dev/null +++ b/src/components/Newsletter.js @@ -0,0 +1,57 @@ +import React, { useState } from "react"; +import Form from "react-bootstrap/Form"; +import Col from "react-bootstrap/Col"; +import FormField from "./FormField"; +import Button from "react-bootstrap/Button"; +import newsletter from "./../util/newsletter.js"; +import { useForm } from "react-hook-form"; + +function Newsletter(props) { + const [subscribed, setSubscribed] = useState(false); + const { handleSubmit, register, errors } = useForm(); + + const onSubmit = ({ email }) => { + setSubscribed(true); + // Parent component can optionally + // find out when subscribed. + props.onSubscribed && props.onSubscribed(); + // Subscribe them + newsletter.subscribe({ email }); + }; + + return ( + <> + {subscribed === false && ( + <Form onSubmit={handleSubmit(onSubmit)}> + <Form.Row> + <Col> + <FormField + size={props.size} + name="email" + type="email" + placeholder="Email" + error={errors.email} + inputRef={register({ + required: "Please enter an email address", + })} + /> + </Col> + <Col xs="auto"> + <Button + variant={props.buttonColor} + size={props.size} + type="submit" + > + {props.buttonText} + </Button> + </Col> + </Form.Row> + </Form> + )} + + {subscribed === true && <div>{props.subscribedMessage}</div>} + </> + ); +} + +export default Newsletter; diff --git a/src/components/NewsletterSection.js b/src/components/NewsletterSection.js new file mode 100644 index 0000000..d65ef58 --- /dev/null +++ b/src/components/NewsletterSection.js @@ -0,0 +1,43 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import SectionHeader from "./SectionHeader"; +import Newsletter from "./Newsletter"; + +function NewsletterSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <Row className="justify-content-center align-items-center"> + <Col xs={12} lg={6}> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={2} + spaced={false} + /> + </Col> + <Col xs={12} lg={6} className="mt-4 mt-lg-0"> + <Newsletter + parentColor={props.color} + buttonText={props.buttonText} + inputPlaceholder={props.inputPlaceholder} + subscribedMessage={props.subscribedMessage} + size="lg" + /> + </Col> + </Row> + </Container> + </Section> + ); +} + +export default NewsletterSection; diff --git a/src/components/PageLoader.js b/src/components/PageLoader.js new file mode 100644 index 0000000..d125ce1 --- /dev/null +++ b/src/components/PageLoader.js @@ -0,0 +1,23 @@ +import React from "react"; +import Section from "./Section"; +import Spinner from "react-bootstrap/Spinner"; + +function PageLoader(props) { + const { style, ...otherProps } = props; + + return ( + <Section + bg="white" + className="d-flex justify-content-center align-items-center" + style={{ + height: "400px", + ...style, + }} + {...otherProps} + > + <Spinner animation="border" variant="primary" /> + </Section> + ); +} + +export default PageLoader; diff --git a/src/components/ReauthModal.js b/src/components/ReauthModal.js new file mode 100644 index 0000000..4ce3a03 --- /dev/null +++ b/src/components/ReauthModal.js @@ -0,0 +1,112 @@ +import React, { useState } from "react"; +import Modal from "react-bootstrap/Modal"; +import FormAlert from "./FormAlert"; +import Form from "react-bootstrap/Form"; +import FormField from "./FormField"; +import Button from "react-bootstrap/Button"; +import Spinner from "react-bootstrap/Spinner"; +import AuthSocial from "./AuthSocial"; +import { useAuth } from "./../util/auth.js"; +import { useForm } from "react-hook-form"; + +function ReauthModal(props) { + const auth = useAuth(); + const [pending, setPending] = useState(false); + const [formAlert, setFormAlert] = useState(null); + + const { register, handleSubmit, errors } = useForm(); + + const onSubmit = (data) => { + const { pass } = data; + setPending(true); + + auth + .signin(auth.user.email, pass) + .then(() => { + // Call failed action that originally required reauth + props.callback(); + // Let parent know we're done so they can hide modal + props.onDone(); + }) + .catch((error) => { + // Hide pending indicator + setPending(false); + // Show error alert message + setFormAlert({ + type: "error", + message: error.message, + }); + }); + }; + + return ( + <Modal show={true} onHide={props.onDone}> + <Modal.Header closeButton={true}> + Please sign in again to complete this action + </Modal.Header> + <Modal.Body> + {formAlert && ( + <FormAlert type={formAlert.type} message={formAlert.message} /> + )} + + {props.provider === "password" && ( + <Form onSubmit={handleSubmit(onSubmit)}> + <Form.Group controlId="formConfirmPass"> + <FormField + size={props.inputSize} + name="pass" + type="password" + placeholder="Password" + error={errors.pass} + inputRef={register({ + required: "Please enter your password", + })} + /> + </Form.Group> + <Button + variant="primary" + block={true} + type="submit" + disabled={pending} + > + <span>Submit</span> + + {pending && ( + <Spinner + animation="border" + size="sm" + role="status" + aria-hidden={true} + className="ml-2" + > + <span className="sr-only">Loading...</span> + </Spinner> + )} + </Button> + </Form> + )} + + {props.provider !== "password" && ( + <AuthSocial + type="signin" + buttonText="Sign in" + providers={[props.provider]} + showLastUsed={false} + onAuth={() => { + props.callback(); + props.onDone(); + }} + onError={(message) => { + setFormAlert({ + type: "error", + message: message, + }); + }} + /> + )} + </Modal.Body> + </Modal> + ); +} + +export default ReauthModal; diff --git a/src/components/Section.js b/src/components/Section.js new file mode 100644 index 0000000..91da614 --- /dev/null +++ b/src/components/Section.js @@ -0,0 +1,48 @@ +import React from "react"; +import BackgroundImage from "./BackgroundImage"; +import "./Section.scss"; + +function Section(props) { + const { + bg, + textColor, + bgImage, + bgImageOpacity, + bgImageRepeat, + className, + children, + ...otherProps + } = props; + + return ( + <section + className={ + "SectionComponent py-5 position-relative" + + (props.bg ? ` bg-${props.bg}` : "") + + (props.textColor ? ` text-${props.textColor}` : "") + + (className ? ` ${className}` : "") + } + {...otherProps} + > + {bgImage && ( + <BackgroundImage + image={bgImage} + opacity={bgImageOpacity} + repeat={bgImageRepeat} + /> + )} + + <div + className={ + "" + + (["md", "lg"].includes(props.size) ? " py-md-5" : "") + + (props.size === "lg" ? " my-md-5" : "") + } + > + {props.children} + </div> + </section> + ); +} + +export default Section; diff --git a/src/components/Section.scss b/src/components/Section.scss new file mode 100644 index 0000000..2228204 --- /dev/null +++ b/src/components/Section.scss @@ -0,0 +1,12 @@ +.SectionComponent { + // Ensure container is above bgImage + .container { + position: relative; + } + + // Add light border if two white + // sections next to each other. + .bg-white + &.bg-white { + border-top: 1px solid #F0F0F0; + } +} diff --git a/src/components/SectionHeader.js b/src/components/SectionHeader.js new file mode 100644 index 0000000..85d1eab --- /dev/null +++ b/src/components/SectionHeader.js @@ -0,0 +1,36 @@ +import React from "react"; +import "./SectionHeader.scss"; + +function SectionHeader(props) { + // Render nothing if no title or subtitle + if (!props.title && !props.subtitle) { + return null; + } + + return ( + <header + className={ + "SectionHeader" + (props.className ? ` ${props.className}` : "") + } + > + {props.title && ( + <h1 + className={ + "font-weight-bold" + + (props.subtitle && props.spaced ? " mb-4" : "") + + (!props.subtitle ? " mb-0" : "") + + (props.size ? ` h${props.size}` : "") + } + > + {props.title} + </h1> + )} + + {props.subtitle && ( + <p className="SectionHeader__subtitle mb-0">{props.subtitle}</p> + )} + </header> + ); +} + +export default SectionHeader; diff --git a/src/components/SectionHeader.scss b/src/components/SectionHeader.scss new file mode 100644 index 0000000..ccb8c1c --- /dev/null +++ b/src/components/SectionHeader.scss @@ -0,0 +1,15 @@ +.SectionHeader { + // Add bottom margin if element below + &:not(:last-child) { + margin-bottom: 2rem; + } + + &__subtitle { + // Subtitle text generally isn't very long + // so usually looks better to limit width. + max-width: 700px; + // So we can have max-width but still + // have alignment controlled by text-align. + display: inline-block; + } +} diff --git a/src/components/SettingsBilling.js b/src/components/SettingsBilling.js new file mode 100644 index 0000000..86a8a46 --- /dev/null +++ b/src/components/SettingsBilling.js @@ -0,0 +1,32 @@ +import React, { useEffect } from "react"; +import PageLoader from "./PageLoader"; +import { useAuth } from "./../util/auth.js"; +import { useRouter } from "./../util/router.js"; +import { redirectToBilling } from "./../util/stripe.js"; + +function SettingsBilling(props) { + const router = useRouter(); + const auth = useAuth(); + + useEffect(() => { + if (auth.user.planIsActive) { + // If user has an active plan then + // take them to Stripe billing + redirectToBilling(); + } else { + // Otherwise go to pricing so they can + // purchase a plan + router.push("/pricing"); + } + }, [auth.user.planId]); + + return ( + <PageLoader + style={{ + height: "50px", + }} + /> + ); +} + +export default SettingsBilling; diff --git a/src/components/SettingsGeneral.js b/src/components/SettingsGeneral.js new file mode 100644 index 0000000..5aa05fc --- /dev/null +++ b/src/components/SettingsGeneral.js @@ -0,0 +1,96 @@ +import React, { useState } from "react"; +import Form from "react-bootstrap/Form"; +import FormField from "./FormField"; +import Button from "react-bootstrap/Button"; +import Spinner from "react-bootstrap/Spinner"; +import { useAuth } from "./../util/auth.js"; +import { useForm } from "react-hook-form"; + +function SettingsGeneral(props) { + const auth = useAuth(); + const [pending, setPending] = useState(false); + + const { register, handleSubmit, errors } = useForm(); + + const onSubmit = (data) => { + // Show pending indicator + setPending(true); + + return auth + .updateProfile(data) + .then(() => { + // Set success status + props.onStatus({ + type: "success", + message: "Your profile has been updated", + }); + }) + .catch((error) => { + if (error.code === "auth/requires-recent-login") { + props.onStatus({ + type: "requires-recent-login", + // Resubmit after reauth flow + callback: () => onSubmit(data), + }); + } else { + // Set error status + props.onStatus({ + type: "error", + message: error.message, + }); + } + }) + .finally(() => { + // Hide pending indicator + setPending(false); + }); + }; + + return ( + <Form onSubmit={handleSubmit(onSubmit)}> + <Form.Group controlId="formName"> + <FormField + name="name" + type="text" + label="Name" + defaultValue={auth.user.name} + placeholder="Name" + error={errors.name} + inputRef={register({ + required: "Please enter your name", + })} + /> + </Form.Group> + <Form.Group controlId="formEmail"> + <FormField + name="email" + type="email" + label="Email Address" + defaultValue={auth.user.email} + placeholder="Email" + error={errors.email} + inputRef={register({ + required: "Please enter your email", + })} + /> + </Form.Group> + <Button type="submit" disabled={pending}> + <span>Save</span> + + {pending && ( + <Spinner + animation="border" + size="sm" + role="status" + aria-hidden={true} + className="ml-2" + > + <span className="sr-only">Sending...</span> + </Spinner> + )} + </Button> + </Form> + ); +} + +export default SettingsGeneral; diff --git a/src/components/SettingsNav.js b/src/components/SettingsNav.js new file mode 100644 index 0000000..d8d5162 --- /dev/null +++ b/src/components/SettingsNav.js @@ -0,0 +1,27 @@ +import React from "react"; +import Nav from "react-bootstrap/Nav"; +import { LinkContainer } from "react-router-bootstrap"; + +function SettingsNav(props) { + return ( + <Nav variant="pills" {...props}> + <Nav.Item> + <LinkContainer to="/settings/general"> + <Nav.Link eventKey="general">General</Nav.Link> + </LinkContainer> + </Nav.Item> + <Nav.Item> + <LinkContainer to="/settings/password"> + <Nav.Link eventKey="password">Password</Nav.Link> + </LinkContainer> + </Nav.Item> + <Nav.Item> + <LinkContainer to="/settings/billing"> + <Nav.Link eventKey="billing">Billing</Nav.Link> + </LinkContainer> + </Nav.Item> + </Nav> + ); +} + +export default SettingsNav; diff --git a/src/components/SettingsPassword.js b/src/components/SettingsPassword.js new file mode 100644 index 0000000..02f39fc --- /dev/null +++ b/src/components/SettingsPassword.js @@ -0,0 +1,109 @@ +import React, { useState } from "react"; +import Form from "react-bootstrap/Form"; +import FormField from "./FormField"; +import Button from "react-bootstrap/Button"; +import Spinner from "react-bootstrap/Spinner"; +import { useAuth } from "./../util/auth.js"; +import { useForm } from "react-hook-form"; + +function SettingsPassword(props) { + const auth = useAuth(); + const [pending, setPending] = useState(false); + + const { register, handleSubmit, errors, reset, getValues } = useForm(); + + const onSubmit = (data) => { + // Show pending indicator + setPending(true); + + auth + .updatePassword(data.pass) + .then(() => { + // Clear form + reset(); + // Set success status + props.onStatus({ + type: "success", + message: "Your password has been updated", + }); + }) + .catch((error) => { + if (error.code === "auth/requires-recent-login") { + // Update state to show re-authentication modal + props.onStatus({ + type: "requires-recent-login", + // Resubmit after reauth flow + callback: () => onSubmit({ pass: data.pass }), + }); + } else { + // Set error status + props.onStatus({ + type: "error", + message: error.message, + }); + } + }) + .finally(() => { + // Hide pending indicator + setPending(false); + }); + }; + + return ( + <Form onSubmit={handleSubmit(onSubmit)}> + <Form.Group controlId="formName"> + <FormField + name="pass" + type="password" + label="New Password" + placeholder="Password" + error={errors.pass} + inputRef={register({ + required: "Please enter a password", + })} + /> + </Form.Group> + <Form.Group controlId="formEmail"> + <FormField + name="confirmPass" + type="password" + label="Confirm New Password" + placeholder="Confirm Password" + error={errors.confirmPass} + inputRef={register({ + required: "Please enter your new password again", + validate: (value) => { + if (value === getValues().pass) { + return true; + } else { + return "This doesn't match your password"; + } + }, + })} + /> + </Form.Group> + <Button + variant={props.buttonColor} + size={props.inputSize} + type="submit" + disabled={pending} + > + <span>Save</span> + + {pending && ( + <Spinner + animation="border" + size="sm" + role="status" + aria-hidden={true} + className="ml-2" + > + <span className="sr-only">Sending...</span> + </Spinner> + )} + </Button> + </Form> + ); +} + +export default SettingsPassword; diff --git a/src/components/SettingsSection.js b/src/components/SettingsSection.js new file mode 100644 index 0000000..8a56b73 --- /dev/null +++ b/src/components/SettingsSection.js @@ -0,0 +1,94 @@ +import React, { useState } from "react"; +import Section from "./Section"; +import ReauthModal from "./ReauthModal"; +import SettingsNav from "./SettingsNav"; +import Container from "react-bootstrap/Container"; +import FormAlert from "./FormAlert"; +import SettingsGeneral from "./SettingsGeneral"; +import SettingsPassword from "./SettingsPassword"; +import SettingsBilling from "./SettingsBilling"; +import { useAuth } from "./../util/auth.js"; + +function SettingsSection(props) { + const auth = useAuth(); + const [formAlert, setFormAlert] = useState(null); + + // State to control whether we show a re-authentication flow + // Required by some security sensitive actions, such as changing password. + const [reauthState, setReauthState] = useState({ + show: false, + }); + + const validSections = { + general: true, + password: true, + billing: true, + }; + + const section = validSections[props.section] ? props.section : "general"; + + // Handle status of type "success", "error", or "requires-recent-login" + // We don't treat "requires-recent-login" as an error as we handle it + // gracefully by taking the user through a re-authentication flow. + const handleStatus = ({ type, message, callback }) => { + if (type === "requires-recent-login") { + // First clear any existing message + setFormAlert(null); + // Then update state to show re-authentication modal + setReauthState({ + show: true, + // Failed action to try again after reauth + callback: callback, + }); + } else { + // Display message to user (type is success or error) + setFormAlert({ + type: type, + message: message, + }); + } + }; + + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + {reauthState.show && ( + <ReauthModal + callback={reauthState.callback} + provider={auth.user.providers[0]} + onDone={() => setReauthState({ show: false })} + /> + )} + + <SettingsNav activeKey={section} className="justify-content-center" /> + <Container + className="mt-5" + style={{ + maxWidth: section !== "billing" ? "450px" : undefined, + }} + > + {formAlert && ( + <FormAlert + type={formAlert.type} + message={formAlert.message} + className="mx-auto mb-4" + style={{ maxWidth: "450px" }} + /> + )} + + {section === "general" && <SettingsGeneral onStatus={handleStatus} />} + + {section === "password" && <SettingsPassword onStatus={handleStatus} />} + + {section === "billing" && <SettingsBilling onStatus={handleStatus} />} + </Container> + </Section> + ); +} + +export default SettingsSection; diff --git a/src/components/TeamBios.js b/src/components/TeamBios.js new file mode 100644 index 0000000..b19a77b --- /dev/null +++ b/src/components/TeamBios.js @@ -0,0 +1,32 @@ +import React from "react"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Card from "react-bootstrap/Card"; +import Avatar from "./Avatar"; + +function TeamBios(props) { + return ( + <Row className="justify-content-center"> + {props.items.map((item, index) => ( + <Col + xs={12} + md={6} + lg={4} + className="py-3 d-flex align-items-stretch" + key={index} + > + <Card> + <Card.Body className="d-flex flex-column text-center align-items-center p-4"> + <Avatar src={item.avatar} alt={item.name} size="128px" /> + <h6 className="font-weight-bold mb-0 mt-4">{item.name}</h6> + <small>{item.role}</small> + <Card.Text className="mt-4">{item.bio}</Card.Text> + </Card.Body> + </Card> + </Col> + ))} + </Row> + ); +} + +export default TeamBios; diff --git a/src/components/TeamBiosSection.js b/src/components/TeamBiosSection.js new file mode 100644 index 0000000..202db55 --- /dev/null +++ b/src/components/TeamBiosSection.js @@ -0,0 +1,63 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import TeamBios from "./TeamBios"; + +function TeamBiosSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={2} + spaced={true} + className="text-center" + /> + <TeamBios + items={[ + { + avatar: "https://uploads.divjoy.com/pravatar-150x-68.jpeg", + name: "John Smith", + role: "Software Engineer", + bio: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo.", + twitterUrl: "https://twitter.com", + facebookUrl: "https://facebook.com", + linkedinUrl: "https://linkedin.com", + }, + { + avatar: "https://uploads.divjoy.com/pravatar-150x-35.jpeg", + name: "Lisa Zinn", + role: "Software Engineer", + bio: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam! Labore reprehenderit beatae magnam animi!", + twitterUrl: "https://twitter.com", + facebookUrl: "https://facebook.com", + linkedinUrl: "https://linkedin.com", + }, + { + avatar: "https://uploads.divjoy.com/pravatar-150x-16.jpeg", + name: "Diana Low", + role: "Designer", + bio: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam! Labore reprehenderit beatae magnam animi!", + twitterUrl: "https://twitter.com", + facebookUrl: "https://facebook.com", + linkedinUrl: "https://linkedin.com", + }, + ]} + /> + </Container> + </Section> + ); +} + +export default TeamBiosSection; diff --git a/src/components/Testimonials.js b/src/components/Testimonials.js new file mode 100644 index 0000000..cdbd6b8 --- /dev/null +++ b/src/components/Testimonials.js @@ -0,0 +1,26 @@ +import React from "react"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Card from "react-bootstrap/Card"; +import Avatar from "./Avatar"; + +function Testimonials(props) { + return ( + <Row className="justify-content-center"> + {props.items.map((item, index) => ( + <Col xs={12} md={4} className="py-3" key={index}> + <Card> + <Card.Body className="p-4 text-center"> + <Avatar src={item.avatar} alt={item.name} size="96px" /> + <Card.Text className="mt-4">"{item.testimonial}"</Card.Text> + <h6 className="font-weight-bold mb-0 mt-4">{item.name}</h6> + <small>{item.company}</small> + </Card.Body> + </Card> + </Col> + ))} + </Row> + ); +} + +export default Testimonials; diff --git a/src/components/TestimonialsSection.js b/src/components/TestimonialsSection.js new file mode 100644 index 0000000..cf7d05b --- /dev/null +++ b/src/components/TestimonialsSection.js @@ -0,0 +1,54 @@ +import React from "react"; +import Section from "./Section"; +import Container from "react-bootstrap/Container"; +import SectionHeader from "./SectionHeader"; +import Testimonials from "./Testimonials"; + +function TestimonialsSection(props) { + return ( + <Section + bg={props.bg} + textColor={props.textColor} + size={props.size} + bgImage={props.bgImage} + bgImageOpacity={props.bgImageOpacity} + > + <Container> + <SectionHeader + title={props.title} + subtitle={props.subtitle} + size={2} + spaced={true} + className="text-center" + /> + <Testimonials + items={[ + { + avatar: "https://uploads.divjoy.com/pravatar-150x-5.jpeg", + name: "Sarah Kline", + testimonial: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.", + company: "Company", + }, + { + avatar: "https://uploads.divjoy.com/pravatar-150x-48.jpeg", + name: "Shawna Murray", + testimonial: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam!", + company: "Company", + }, + { + avatar: "https://uploads.divjoy.com/pravatar-150x-12.jpeg", + name: "Blake Elder", + testimonial: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae.", + company: "Company", + }, + ]} + /> + </Container> + </Section> + ); +} + +export default TestimonialsSection; diff --git a/src/components/header/index.js b/src/components/header/index.js deleted file mode 100644 index 89354c2..0000000 --- a/src/components/header/index.js +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import AppBar from "@material-ui/core/AppBar"; -import Toolbar from "@material-ui/core/Toolbar"; -import Typography from "@material-ui/core/Typography"; -import { makeStyles } from "@material-ui/core/styles"; -import { Link } from "react-router-dom"; - -const useStyles = makeStyles({ - header: { - - } - -}) - -export default function Header() { - - const classes = useStyles(); - - return ( - <AppBar className={classes.header} position="static"> - <Toolbar> - <Typography variant="h6" > - Locali - </Typography> - <div> - <Link to="/">Home</Link> - <Link to="/search">Search</Link> - <Link to="/check-in">Single Business Page</Link> - <Link to="/dashboard">Business Dashboard</Link> - <Link to="/user">User Profile</Link> - - </div> - - </Toolbar> - </AppBar> - ) -} \ No newline at end of file diff --git a/src/config/theme/index.js b/src/config/theme/index.js deleted file mode 100644 index caec1ee..0000000 --- a/src/config/theme/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import {createMuiTheme} from "@material-ui/core"; - -// More information available here: https://material-ui.com/customization/default-theme/ -const theme = createMuiTheme({ - palette: { - primary: { - main: "#ffe50e" - }, - secondary: { - main: "#000" - } - }, - typography: { - h1: { - fontFamily: '"Reckt", "Open Sans"', - fontWeight: 500 - } - } -}) - -export default theme; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 481d179..dd5b00d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,44 +1,11 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { - BrowserRouter as Router, - Switch, - Route, - Link -} from "react-router-dom"; -import CssBaseline from "@material-ui/core/CssBaseline"; -import SplashScreen from "./screens/splash"; -import Header from "components/header"; -import {ThemeProvider} from "@material-ui/core/styles"; -import theme from "./config/theme"; - - -export default function App(){ - return ( - <Router> - <ThemeProvider theme={theme}> - <CssBaseline/> - <Header/> - <Switch> - <Route path="/search"> - <h1>Business Results Page</h1> - </Route> - <Route path="/check-in"> - <h1>Single Business Listing Page</h1> - </Route> - <Route path="/user"> - <h1>User Profile Page</h1> - </Route> - <Route path="/dashboard"> - <h1>Business Dashboard Page</h1> - </Route> - <Route path="/"> - <SplashScreen/> - </Route> - </Switch> - </ThemeProvider> - </Router> - ) -} - -ReactDOM.render(<App/>, document.getElementById('app')); \ No newline at end of file +import React from "react"; +import ReactDom from "react-dom"; +import App from "./pages/_app"; +import * as serviceWorker from "./serviceWorker"; + +ReactDom.render(<App />, document.getElementById("root")); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: https://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/src/pages/_app.js b/src/pages/_app.js new file mode 100644 index 0000000..a275d64 --- /dev/null +++ b/src/pages/_app.js @@ -0,0 +1,63 @@ +import React from "react"; +import "./../styles/global.scss"; +import NavbarCustom from "./../components/NavbarCustom"; +import IndexPage from "./index"; +import AboutPage from "./about"; +import FaqPage from "./faq"; +import ContactPage from "./contact"; +import DashboardPage from "./dashboard"; +import SettingsPage from "./settings"; +import AuthPage from "./auth"; +import { Switch, Route, Router } from "./../util/router.js"; +import NotFoundPage from "./not-found.js"; +import Footer from "./../components/Footer"; +import "./../util/analytics.js"; +import { ProvideAuth } from "./../util/auth.js"; + +function App(props) { + return ( + <ProvideAuth> + <Router> + <> + <NavbarCustom + bg="white" + variant="light" + expand="md" + logo="https://uploads.divjoy.com/logo.svg" + /> + + <Switch> + <Route exact path="/" component={IndexPage} /> + + <Route exact path="/about" component={AboutPage} /> + + <Route exact path="/faq" component={FaqPage} /> + + <Route exact path="/contact" component={ContactPage} /> + + <Route exact path="/dashboard" component={DashboardPage} /> + + <Route exact path="/settings/:section" component={SettingsPage} /> + + <Route exact path="/auth/:type" component={AuthPage} /> + + <Route component={NotFoundPage} /> + </Switch> + + <Footer + bg="light" + textColor="dark" + size="sm" + bgImage="" + bgImageOpacity={1} + description="A short description of what you do here" + copyright="© 2019 Company" + logo="https://uploads.divjoy.com/logo.svg" + /> + </> + </Router> + </ProvideAuth> + ); +} + +export default App; diff --git a/src/pages/about.js b/src/pages/about.js new file mode 100644 index 0000000..884e60d --- /dev/null +++ b/src/pages/about.js @@ -0,0 +1,30 @@ +import React from "react"; +import HeroSection2 from "./../components/HeroSection2"; +import TeamBiosSection from "./../components/TeamBiosSection"; + +function AboutPage(props) { + return ( + <> + <HeroSection2 + bg="primary" + textColor="white" + size="lg" + bgImage="" + bgImageOpacity={1} + title="We help you make money" + subtitle="Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum consequatur numquam aliquam tenetur ad amet inventore hic beatae, quas accusantium perferendis sapiente explicabo, corporis totam!" + /> + <TeamBiosSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Meet the Team" + subtitle="" + /> + </> + ); +} + +export default AboutPage; diff --git a/src/pages/auth.js b/src/pages/auth.js new file mode 100644 index 0000000..b04c5dc --- /dev/null +++ b/src/pages/auth.js @@ -0,0 +1,23 @@ +import React from "react"; +import AuthSection from "./../components/AuthSection"; +import { useRouter } from "./../util/router.js"; + +function AuthPage(props) { + const router = useRouter(); + + return ( + <AuthSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + inputSize="lg" + type={router.query.type} + providers={["google", "facebook", "twitter"]} + afterAuthPath={router.query.next || "/dashboard"} + /> + ); +} + +export default AuthPage; diff --git a/src/pages/contact.js b/src/pages/contact.js new file mode 100644 index 0000000..5093c79 --- /dev/null +++ b/src/pages/contact.js @@ -0,0 +1,22 @@ +import React from "react"; +import ContactSection from "./../components/ContactSection"; + +function ContactPage(props) { + return ( + <ContactSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Contact Us" + subtitle="" + buttonText="Send message" + buttonColor="primary" + showNameField={true} + inputSize="md" + /> + ); +} + +export default ContactPage; diff --git a/src/pages/dashboard.js b/src/pages/dashboard.js new file mode 100644 index 0000000..4d36c12 --- /dev/null +++ b/src/pages/dashboard.js @@ -0,0 +1,17 @@ +import React from "react"; +import DashboardSection from "./../components/DashboardSection"; +import { requireAuth } from "./../util/auth.js"; + +function DashboardPage(props) { + return ( + <DashboardSection + bg="white" + textColor="dark" + size="md" + title="Dashboard" + subtitle="" + /> + ); +} + +export default requireAuth(DashboardPage); diff --git a/src/pages/faq.js b/src/pages/faq.js new file mode 100644 index 0000000..94eae67 --- /dev/null +++ b/src/pages/faq.js @@ -0,0 +1,18 @@ +import React from "react"; +import FaqSection from "./../components/FaqSection"; + +function FaqPage(props) { + return ( + <FaqSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Frequently Asked Questions" + subtitle="" + /> + ); +} + +export default FaqPage; diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 0000000..5a6b0d4 --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,64 @@ +import React from "react"; +import HeroSection from "./../components/HeroSection"; +import FeaturesSection from "./../components/FeaturesSection"; +import TestimonialsSection from "./../components/TestimonialsSection"; +import NewsletterSection from "./../components/NewsletterSection"; +import { useRouter } from "./../util/router.js"; + +function IndexPage(props) { + const router = useRouter(); + + return ( + <> + <HeroSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Your landing page title here" + subtitle="This landing page is perfect for showing off your awesome product and driving people to sign up for a paid plan." + buttonText="Get Started" + buttonColor="primary" + image="https://uploads.divjoy.com/undraw-japan_ubgk.svg" + buttonOnClick={() => { + // Navigate to pricing page + router.push("/pricing"); + }} + /> + <FeaturesSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Features" + subtitle="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud." + /> + <TestimonialsSection + bg="light" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Here's what people are saying" + subtitle="" + /> + <NewsletterSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + title="Stay in the know" + subtitle="Receive our latest articles and feature updates" + buttonText="Subscribe" + buttonColor="primary" + inputPlaceholder="Enter your email" + subscribedMessage="You are now subscribed!" + /> + </> + ); +} + +export default IndexPage; diff --git a/src/pages/not-found.js b/src/pages/not-found.js new file mode 100644 index 0000000..123a713 --- /dev/null +++ b/src/pages/not-found.js @@ -0,0 +1,11 @@ +import React from "react"; + +function NotFoundPage(props) { + return ( + <div style={{ padding: "50px", width: "100%", textAlign: "center" }}> + The page <code>{props.location.pathname}</code> could not be found. + </div> + ); +} + +export default NotFoundPage; diff --git a/src/pages/settings.js b/src/pages/settings.js new file mode 100644 index 0000000..700a148 --- /dev/null +++ b/src/pages/settings.js @@ -0,0 +1,22 @@ +import React from "react"; +import SettingsSection from "./../components/SettingsSection"; +import { useRouter } from "./../util/router.js"; +import { requireAuth } from "./../util/auth.js"; + +function SettingsPage(props) { + const router = useRouter(); + + return ( + <SettingsSection + bg="white" + textColor="dark" + size="md" + bgImage="" + bgImageOpacity={1} + section={router.query.section} + key={router.query.section} + /> + ); +} + +export default requireAuth(SettingsPage); diff --git a/src/screens/splash/index.js b/src/screens/splash/index.js deleted file mode 100644 index dc2ef6b..0000000 --- a/src/screens/splash/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' -import { Typography } from "@material-ui/core"; - -export default function SplashScreen() { - - return ( - <> - <Typography variant="h1">I'm a splash screen</Typography> - <h2>I'm not supposed to have a header</h2> - </> - ) -} \ No newline at end of file diff --git a/src/serviceWorker.js b/src/serviceWorker.js new file mode 100644 index 0000000..c696c28 --- /dev/null +++ b/src/serviceWorker.js @@ -0,0 +1,136 @@ +/* eslint-disable */ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read https://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match( + /^127(?:.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister(); + }); + } +} diff --git a/src/styles/global.scss b/src/styles/global.scss new file mode 100644 index 0000000..a61da2a --- /dev/null +++ b/src/styles/global.scss @@ -0,0 +1,56 @@ +@charset "utf-8"; + +// COLORS +$theme-colors: ( + "primary": #0074d9, + "secondary": #6c757d, + "success": #28a745, + "danger": #ff4136, + "warning": #ffc107, + "info": #17a2b8, + "light": #f8f9fa, + "dark": #343a40, + "white": #ffffff, + "transparent": transparent, +); + +// TEXT +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-family-serif: Georgia, "Times New Roman", Times, serif; +$font-family-base: $font-family-sans-serif; +$font-size-base: 1rem; + +// BREAKPOINTS +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, +); + +// SEE DOCS FOR MORE: +// https://bit.ly/2sgFMdb + +// IMPORT BOOTSTRAP +@import "~bootstrap/scss/bootstrap"; + +// IMPORT FONT AWESOME +@import url("https://use.fontawesome.com/releases/v5.10.1/css/all.css"); + +#root { + // Full height of screen and flex so that we can push footer + // to the bottom even if content is shorter than screen + height: 100vh; + display: flex; + flex-direction: column; + // Push footer to the bottom of the screen + > .footer { + margin-top: auto; + } + // Prevent child elements from shrinking when content + // is taller than the screen (quirk of having flex parent) + > * { + flex-shrink: 0; + } +} diff --git a/src/util/analytics.js b/src/util/analytics.js new file mode 100644 index 0000000..1b15589 --- /dev/null +++ b/src/util/analytics.js @@ -0,0 +1,26 @@ +import Analytics from "analytics"; +import googleAnalyticsPlugin from "@analytics/google-analytics"; +import { history } from "./router.js"; + +// Initialize analytics and plugins +// Documentation: https://getanalytics.io +const analytics = Analytics({ + debug: process.env.NODE_ENV !== "production", + plugins: [ + googleAnalyticsPlugin({ + trackingId: process.env.REACT_APP_GA_TRACKING_ID, + }), + ], +}); + +// Track initial pageview +if (typeof window !== "undefined") { + analytics.page(); +} + +// Track pageview on route change +history.listen(() => { + analytics.page(); +}); + +export default analytics; diff --git a/src/util/auth.js b/src/util/auth.js new file mode 100644 index 0000000..2ce52fa --- /dev/null +++ b/src/util/auth.js @@ -0,0 +1,299 @@ +import React, { + useState, + useEffect, + useMemo, + useContext, + createContext, +} from "react"; +import queryString from "query-string"; +import firebase from "./firebase"; +import { useUser, createUser, updateUser } from "./db"; +import { history } from "./router"; +import PageLoader from "./../components/PageLoader"; +import { getFriendlyPlanId } from "./prices"; + +// Whether to merge user data from database into auth.user +const MERGE_DB_USER = true; + +const authContext = createContext(); + +// Context Provider component that wraps your app and makes auth object +// available to any child component that calls the useAuth() hook. +export function ProvideAuth({ children }) { + const auth = useProvideAuth(); + return <authContext.Provider value={auth}>{children}</authContext.Provider>; +} + +// Hook that enables any component to subscribe to auth state +export const useAuth = () => { + return useContext(authContext); +}; + +// Provider hook that creates auth object and handles state +function useProvideAuth() { + // Store auth user object + const [user, setUser] = useState(null); + + // Format final user object and merge extra data from database + const finalUser = usePrepareUser(user); + + // Handle response from authentication functions + const handleAuth = async (response) => { + const { user, additionalUserInfo } = response; + + // Ensure Firebase is actually ready before we continue + await waitForFirebase(); + + // Create the user in the database if they are new + if (additionalUserInfo.isNewUser) { + await createUser(user.uid, { email: user.email }); + } + + // Update user in state + setUser(user); + return user; + }; + + const signup = (email, password) => { + return firebase + .auth() + .createUserWithEmailAndPassword(email, password) + .then(handleAuth); + }; + + const signin = (email, password) => { + return firebase + .auth() + .signInWithEmailAndPassword(email, password) + .then(handleAuth); + }; + + const signinWithProvider = (name) => { + // Get provider data by name ("password", "google", etc) + const providerData = allProviders.find((p) => p.name === name); + + const provider = new providerData.providerMethod(); + + if (providerData.parameters) { + provider.setCustomParameters(providerData.parameters); + } + + return firebase.auth().signInWithPopup(provider).then(handleAuth); + }; + + const signout = () => { + return firebase.auth().signOut(); + }; + + const sendPasswordResetEmail = (email) => { + return firebase.auth().sendPasswordResetEmail(email); + }; + + const confirmPasswordReset = (password, code) => { + // Get code from query string object + const resetCode = code || getFromQueryString("oobCode"); + + return firebase.auth().confirmPasswordReset(resetCode, password); + }; + + const updateEmail = (email) => { + return firebase + .auth() + .currentUser.updateEmail(email) + .then(() => { + // Update user in state (since onAuthStateChanged doesn't get called) + setUser(firebase.auth().currentUser); + }); + }; + + const updatePassword = (password) => { + return firebase.auth().currentUser.updatePassword(password); + }; + + // Update auth user and persist to database (including any custom values in data) + // Forms can call this function instead of multiple auth/db update functions + const updateProfile = async (data) => { + const { email, name, picture } = data; + + // Update auth email + if (email) { + await firebase.auth().currentUser.updateEmail(email); + } + + // Update auth profile fields + if (name || picture) { + let fields = {}; + if (name) fields.displayName = name; + if (picture) fields.photoURL = picture; + await firebase.auth().currentUser.updateProfile(fields); + } + + // Persist all data to the database + await updateUser(user.uid, data); + + // Update user in state + setUser(firebase.auth().currentUser); + }; + + useEffect(() => { + // Subscribe to user on mount + const unsubscribe = firebase.auth().onAuthStateChanged((user) => { + if (user) { + setUser(user); + } else { + setUser(false); + } + }); + + // Unsubscribe on cleanup + return () => unsubscribe(); + }, []); + + return { + user: finalUser, + signup, + signin, + signinWithProvider, + signout, + sendPasswordResetEmail, + confirmPasswordReset, + updateEmail, + updatePassword, + updateProfile, + }; +} + +// A Higher Order Component for requiring authentication +export const requireAuth = (Component) => { + return (props) => { + // Get authenticated user + const auth = useAuth(); + + useEffect(() => { + // Redirect if not signed in + if (auth.user === false) { + history.replace("/auth/signin"); + } + }, [auth]); + + // Show loading indicator + // We're either loading (user is null) or we're about to redirect (user is false) + if (!auth.user) { + return <PageLoader />; + } + + // Render component now that we have user + return <Component {...props} />; + }; +}; + +// Format final user object and merge extra data from database +function usePrepareUser(user) { + // Fetch extra data from database (if enabled and auth user has been fetched) + const userDbQuery = useUser(MERGE_DB_USER && user && user.uid); + + // Memoize so we only create a new object if user or userDbQuery changes + return useMemo(() => { + // Return if auth user is null (loading) or false (not authenticated) + if (!user) return user; + + // Data we want to include from auth user object + let finalUser = { + uid: user.uid, + email: user.email, + name: user.displayName, + picture: user.photoURL, + }; + + // Include an array of user's auth providers, such as ["password", "google", etc] + // Components can read this to prompt user to re-auth with the correct provider + finalUser.providers = user.providerData.map(({ providerId }) => { + return allProviders.find((p) => p.id === providerId).name; + }); + + // If merging user data from database is enabled ... + if (MERGE_DB_USER) { + switch (userDbQuery.status) { + case "loading": + // Return null user so auth is considered loading until we have db data to merge + return null; + case "error": + // Log query error to console + console.error(userDbQuery.error); + return null; + case "success": + // If user data doesn't exist we assume this means user just signed up and the createUser + // function just hasn't completed. We return null to indicate a loading state. + if (userDbQuery.data === null) return null; + + // Merge user data from database into finalUser object + Object.assign(finalUser, userDbQuery.data); + + // Get values we need for setting up some custom fields below + const { stripePriceId, stripeSubscriptionStatus } = userDbQuery.data; + + // Add planId field (such as "basic", "premium", etc) based on stripePriceId + if (stripePriceId) { + finalUser.planId = getFriendlyPlanId(stripePriceId); + } + + // Add planIsActive field and set to true if subscription status is "active" or "trialing" + finalUser.planIsActive = ["active", "trialing"].includes( + stripeSubscriptionStatus + ); + + // no default + } + } + + return finalUser; + }, [user, userDbQuery]); +} + +const allProviders = [ + { + id: "password", + name: "password", + }, + { + id: "google.com", + name: "google", + providerMethod: firebase.auth.GoogleAuthProvider, + }, + { + id: "facebook.com", + name: "facebook", + providerMethod: firebase.auth.FacebookAuthProvider, + parameters: { + // Tell fb to show popup size UI instead of full website + display: "popup", + }, + }, + { + id: "twitter.com", + name: "twitter", + providerMethod: firebase.auth.TwitterAuthProvider, + }, + { + id: "github.com", + name: "github", + providerMethod: firebase.auth.GithubAuthProvider, + }, +]; + +// Waits on Firebase user to be initialized before resolving promise +// This is used to ensure auth is ready before any writing to the db can happen +const waitForFirebase = () => { + return new Promise((resolve) => { + const unsubscribe = firebase.auth().onAuthStateChanged((user) => { + if (user) { + resolve(user); // Resolve promise when we have a user + unsubscribe(); // Prevent from firing again + } + }); + }); +}; + +const getFromQueryString = (key) => { + return queryString.parse(window.location.search)[key]; +}; diff --git a/src/util/contact.js b/src/util/contact.js new file mode 100644 index 0000000..1e74415 --- /dev/null +++ b/src/util/contact.js @@ -0,0 +1,13 @@ +const endpoint = `https://formspree.io/${process.env.REACT_APP_FORMSPREE_CONTACT_ID}`; + +function submit(data) { + return fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }).then((r) => r.json()); +} + +export default { submit }; diff --git a/src/util/db.js b/src/util/db.js new file mode 100644 index 0000000..e35e03d --- /dev/null +++ b/src/util/db.js @@ -0,0 +1,134 @@ +import { useState, useEffect, useRef } from "react"; +import firebase from "./firebase"; + +const firestore = firebase.firestore(); + +/**** USERS ****/ + +// Fetch user data (hook) +// This is called automatically by auth.js and merged into auth.user +export function useUser(uid) { + return useQuery(uid && firestore.collection("users").doc(uid)); +} + +// Update an existing user +export function updateUser(uid, data) { + return firestore.collection("users").doc(uid).update(data); +} + +// Create a new user +export function createUser(uid, data) { + return firestore + .collection("users") + .doc(uid) + .set({ uid, ...data }, { merge: true }); +} + +/**** ITEMS ****/ +/* Example query functions (modify to your needs) */ + +// Fetch all items by owner (hook) +export function useItemsByOwner(owner) { + return useQuery( + owner && firestore.collection("items").where("owner", "==", owner) + ); +} + +// Fetch item data +export function useItem(id) { + return useQuery(id && firestore.collection("items").doc(id)); +} + +// Update an item +export function updateItem(id, data) { + return firestore.collection("items").doc(id).update(data); +} + +// Create a new item +export function createItem(data) { + return firestore.collection("items").add(data); +} + +/**** HELPERS ****/ + +// Custom React hook that subscribes to a Firestore query +function useQuery(query) { + const initialState = { + status: "loading", + data: undefined, + error: null, + }; + + const [state, setState] = useState(initialState); + + // Gives us previous query object if query is the same + // ensuring we don't unsubscribe and resubscribe below. + const queryCached = useQueryCache(query); + + useEffect(() => { + // Subscribe to query unless falsy, which indicates we're + // waiting on other data needed to construct the query object. + if (queryCached) { + return queryCached.onSnapshot( + (response) => { + // Get data for collection or doc + const data = response.docs + ? getCollectionData(response) + : getDocData(response); + + setState({ + status: "success", + data: data, + error: null, + }); + }, + (error) => { + setState((state) => ({ + status: "error", + data: undefined, + error: error, + })); + } + ); + } else { + // Reset back to initial state + if (state.status !== initialState.status) { + setState(initialState); + } + } + }, [queryCached]); + + return state; +} + +// Get doc data +function getDocData(doc) { + return doc.exists === true ? { id: doc.id, ...doc.data() } : null; +} + +// Get array of doc data from collection +function getCollectionData(collection) { + return collection.docs.map((doc) => { + return { id: doc.id, ...doc.data() }; + }); +} + +function useQueryCache(query) { + // Ref for storing previous query object + const previousRef = useRef(); + const previous = previousRef.current; + + // Determine if query object is equal to previous + const isEqual = + (!previous && !query) || (previous && query && previous.isEqual(query)); + + // If not equal update previous to query (for next render) + // and then return new query below. + useEffect(() => { + if (!isEqual) { + previousRef.current = query; + } + }); + + return isEqual ? previous : query; +} diff --git a/src/util/firebase.js b/src/util/firebase.js new file mode 100644 index 0000000..b056390 --- /dev/null +++ b/src/util/firebase.js @@ -0,0 +1,14 @@ +import * as firebase from "firebase/app"; +import "firebase/auth"; +import "firebase/firestore"; + +// Make sure it hasn't already been initialized +if (!firebase.apps.length) { + firebase.initializeApp({ + apiKey: process.env.REACT_APP_FIREBASE_API_KEY, + authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, + projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, + }); +} + +export default firebase; diff --git a/src/util/newsletter.js b/src/util/newsletter.js new file mode 100644 index 0000000..9ecdd62 --- /dev/null +++ b/src/util/newsletter.js @@ -0,0 +1,7 @@ +import { apiRequest } from "./util"; + +function subscribe(data) { + return apiRequest("newsletter", "POST", data); +} + +export default { subscribe }; diff --git a/src/util/prices.js b/src/util/prices.js new file mode 100644 index 0000000..9a5bed7 --- /dev/null +++ b/src/util/prices.js @@ -0,0 +1,19 @@ +// Map our custom plan IDs ("basic", "premium", etc) to Stripe price IDs +const stripePriceIds = { + starter: process.env.REACT_APP_STRIPE_PRICE_STARTER, + pro: process.env.REACT_APP_STRIPE_PRICE_PRO, + business: process.env.REACT_APP_STRIPE_PRICE_BUSINESS, +}; + +// Get Stripe priceId +export function getStripePriceId(planId) { + return stripePriceIds[planId]; +} + +// Get friendly plan ID ("basic", "premium", etc) by Stripe plan ID +// Used in auth.js to include planId in the user object +export function getFriendlyPlanId(stripePriceId) { + return Object.keys(stripePriceIds).find( + (key) => stripePriceIds[key] === stripePriceId + ); +} diff --git a/src/util/router.js b/src/util/router.js new file mode 100644 index 0000000..e535706 --- /dev/null +++ b/src/util/router.js @@ -0,0 +1,86 @@ +/* + A wrapper around React Router that adds a useRouter() hook so that any component + can easily access params, location, history, and trigger navigation. + Import from this file instead of react-router-dom directly. +*/ + +import React, { useMemo, useEffect } from "react"; +import { + Router as RouterOriginal, + useParams, + useLocation, + useHistory, + useRouteMatch, +} from "react-router-dom"; +import queryString from "query-string"; + +// Use a custom history object and pass to Router so that we +// can utilize history.listen() where needed (such as for pageview tracking) +import { createBrowserHistory } from "history"; +export const history = createBrowserHistory(); + +// Export our <Router> component +// Includes custom history object and component for auto-scrolling to top +export function Router({ children }) { + return ( + <RouterOriginal history={history}> + <ScrollToTop /> + {children} + </RouterOriginal> + ); +} + +// Custom useRouter hook for getting route data and methods inside any component. +// NOTE: This hook includes all React Router hooks, which can result in extra re-renders +// in some cases. When needed, you can optimize performance by importing the specific hook +// you need (such as useParams or useLocation) instead of this custom useRouter hook. +export function useRouter() { + const params = useParams(); + const location = useLocation(); + const history = useHistory(); + const match = useRouteMatch(); + + // Return our custom router object + // Memoize so that a new object is only returned if something changes + return useMemo(() => { + return { + // For convenience add push(), replace(), pathname at top level + push: history.push, + replace: history.replace, + pathname: location.pathname, + // Merge params and parsed query string into single "query" object + // so that they can be used interchangeably. + // Example: /:topic?sort=popular -> { topic: "react", sort: "popular" } + query: { + ...queryString.parse(location.search), // Convert string to object + ...params, + }, + // Include match, location, history objects so we have + // access to extra React Router functionality if needed. + match, + location, + history, + }; + }, [params, match, location, history]); +} + +// Remove or customize if you need more advanced scroll behavior +// and don't want to always scroll to top when location.pathname changes. +function ScrollToTop() { + const location = useLocation(); + useEffect(() => { + window.scrollTo(0, 0); + }, [location.pathname]); + return null; +} + +export { + Route, + Switch, + Link, + NavLink, + useParams, + useLocation, + useHistory, + useRouteMatch, +} from "react-router-dom"; diff --git a/src/util/stripe.js b/src/util/stripe.js new file mode 100644 index 0000000..c48fb38 --- /dev/null +++ b/src/util/stripe.js @@ -0,0 +1,36 @@ +import { loadStripe } from "@stripe/stripe-js"; +import { apiRequest } from "./util"; +import { getStripePriceId } from "./prices"; + +let stripe; +// Load the Stripe script +loadStripe(process.env.REACT_APP_STRIPE_PUBLISHABLE_KEY).then( + (stripeInstance) => { + // Set stripe so all functions below have it in scope + stripe = stripeInstance; + } +); + +export async function redirectToCheckout(planId) { + // Create a checkout session + const session = await apiRequest("stripe-create-checkout-session", "POST", { + priceId: getStripePriceId(planId), + }); + + // Ensure if user clicks browser back button from checkout they go to /pricing + // instead of this page or they'll redirect right back to checkout. + window.history.replaceState({}, "", "/build?path=pricing"); + + // Redirect to checkout + return stripe.redirectToCheckout({ + sessionId: session.id, + }); +} + +export async function redirectToBilling() { + // Create a billing session + const session = await apiRequest("stripe-create-billing-session", "POST"); + + // Redirect to billing session url + window.location.href = session.url; +} diff --git a/src/util/util.js b/src/util/util.js new file mode 100644 index 0000000..baab943 --- /dev/null +++ b/src/util/util.js @@ -0,0 +1,36 @@ +import firebase from "./firebase"; + +export async function apiRequest(path, method = "GET", data) { + const accessToken = firebase.auth().currentUser + ? await firebase.auth().currentUser.getIdToken() + : undefined; + + return fetch(`/api/${path}`, { + method: method, + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${accessToken}`, + }, + body: data ? JSON.stringify(data) : undefined, + }) + .then((response) => response.json()) + .then((response) => { + if (response.status === "error") { + // Automatically signout user if accessToken is no longer valid + if (response.code === "auth/invalid-user-token") { + firebase.auth().signOut(); + } + + throw new CustomError(response.code, response.message); + } else { + return response.data; + } + }); +} + +// Create an Error with custom message and code +export function CustomError(code, message) { + const error = new Error(message); + error.code = code; + return error; +}