diff options
| author | Wes Bos <wesbos@gmail.com> | 2018-02-08 10:41:16 -0500 |
|---|---|---|
| committer | Wes Bos <wesbos@gmail.com> | 2018-02-08 10:41:16 -0500 |
| commit | 19c9683e2126c68cb9d231293162c756d69c51fb (patch) | |
| tree | 4679ca2dee47740aa0bf6fe623513c4242e027e6 | |
| parent | eabff7cd396d1f37ceb929e666f082ce57f07919 (diff) | |
WIP
27 files changed, 1097 insertions, 863 deletions
diff --git a/backend/README.md b/backend/README.md index 4acc044..7687fd4 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1 +1,5 @@ What are all these files?! + +What are the steps: + +1. diff --git a/backend/database/datamodel.graphql b/backend/database/datamodel.graphql index c383b23..40dd30c 100644 --- a/backend/database/datamodel.graphql +++ b/backend/database/datamodel.graphql @@ -16,7 +16,7 @@ type User { posts: [Post!]! website: String age: Int - dummy: String + resetToken: String } type Item { diff --git a/backend/database/prisma.yml b/backend/database/prisma.yml index ce652ef..70e10f4 100644 --- a/backend/database/prisma.yml +++ b/backend/database/prisma.yml @@ -1,5 +1,5 @@ # the name for the service (will be part of the service's HTTP endpoint) -service: sick-fits +service: sick-fitz # the cluster and stage the service is deployed to stage: ${env:PRISMA_STAGE} diff --git a/backend/src/generated/prisma.graphql b/backend/src/generated/prisma.graphql index e59a1c9..5e2d471 100644 --- a/backend/src/generated/prisma.graphql +++ b/backend/src/generated/prisma.graphql @@ -30,7 +30,7 @@ type User implements Node { posts(where: PostWhereInput, orderBy: PostOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Post!] website: String age: Int - dummy: String + resetToken: String } @@ -421,7 +421,7 @@ input UserCreateInput { name: String! website: String age: Int - dummy: String + resetToken: String posts: PostCreateManyWithoutAuthorInput } @@ -436,7 +436,7 @@ input UserCreateWithoutPostsInput { name: String! website: String age: Int - dummy: String + resetToken: String } type UserEdge { @@ -457,8 +457,8 @@ enum UserOrderByInput { website_DESC age_ASC age_DESC - dummy_ASC - dummy_DESC + resetToken_ASC + resetToken_DESC updatedAt_ASC updatedAt_DESC createdAt_ASC @@ -472,7 +472,7 @@ type UserPreviousValues { name: String! website: String age: Int - dummy: String + resetToken: String } type UserSubscriptionPayload { @@ -498,7 +498,7 @@ input UserUpdateInput { name: String website: String age: Int - dummy: String + resetToken: String posts: PostUpdateManyWithoutAuthorInput } @@ -517,7 +517,7 @@ input UserUpdateWithoutPostsDataInput { name: String website: String age: Int - dummy: String + resetToken: String } input UserUpdateWithoutPostsInput { @@ -612,20 +612,20 @@ input UserWhereInput { age_lte: Int age_gt: Int age_gte: Int - dummy: String - dummy_not: String - dummy_in: [String!] - dummy_not_in: [String!] - dummy_lt: String - dummy_lte: String - dummy_gt: String - dummy_gte: String - dummy_contains: String - dummy_not_contains: String - dummy_starts_with: String - dummy_not_starts_with: String - dummy_ends_with: String - dummy_not_ends_with: String + resetToken: String + resetToken_not: String + resetToken_in: [String!] + resetToken_not_in: [String!] + resetToken_lt: String + resetToken_lte: String + resetToken_gt: String + resetToken_gte: String + resetToken_contains: String + resetToken_not_contains: String + resetToken_starts_with: String + resetToken_not_starts_with: String + resetToken_ends_with: String + resetToken_not_ends_with: String posts_every: PostWhereInput posts_some: PostWhereInput posts_none: PostWhereInput diff --git a/backend/src/resolvers/Mutation.js b/backend/src/resolvers/Mutation.js index fbae6fe..95be561 100644 --- a/backend/src/resolvers/Mutation.js +++ b/backend/src/resolvers/Mutation.js @@ -2,6 +2,8 @@ const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const { forwardTo } = require('prisma-binding'); const { getUserId, Context } = require('../utils'); +const { randomBytes } = require('crypto'); +const { promisify } = require('util'); const mutations = { // Signup Mutations @@ -17,7 +19,7 @@ const mutations = { }; }, - async login(parent, { email, password }, ctx, info) { + async signin(parent, { email, password }, ctx, info) { const user = await ctx.db.query.user({ where: { email } }); if (!user) { throw new Error(`No such user found for email: ${email}`); @@ -40,8 +42,7 @@ const mutations = { }, async deleteItem(parent, args, ctx, info) { - console.log('gonna delete one'); - console.log(args); + // TODO - handle auth for deleting an item return ctx.db.mutation.deleteItem( { where: { @@ -53,7 +54,6 @@ const mutations = { }, async updateItem(parent, args, ctx, info) { - console.log('Updating an item'); const updates = { ...args }; delete updates.id; return ctx.db.mutation.updateItem({ @@ -123,9 +123,30 @@ const mutations = { text: args.text, }, }); - console.log(updatedPost); return updatedPost; }, + + // Send password request + async requestReset(parent, args, ctx, info) { + // 1. find if there is a user with that email + const user = await ctx.db.query.user({ where: { email: args.email } }); + + if (!user) { + throw new Error(`No user with the email ${args.email}`); + } + console.log(user); + // 2. Set a reset token, and a reset date + // const resetToken = await promisify(randomBytes)(20); + // const resetTokenExpiry = Date.now() + 3600000; // 1 hour from now + // console.log({ resetToken, resetTokenExpiry }); + // const res = await ctx.db.mutation.updateUser({ + // where: { email: args.email }, + // data: { resetToken, resetTokenExpiry }, + // }); + + // console.log(res); + // 3. Send them their token via email + }, }; module.exports = mutations; diff --git a/backend/src/resolvers/Query.js b/backend/src/resolvers/Query.js index a2eb749..e6ea299 100644 --- a/backend/src/resolvers/Query.js +++ b/backend/src/resolvers/Query.js @@ -1,4 +1,4 @@ -const { getUserId, Context } = require('../utils'); +const { getUserId, Context, checkForUserId } = require('../utils'); const { forwardTo } = require('prisma-binding'); const Query = { @@ -31,6 +31,11 @@ const Query = { }, me(parent, args, ctx, info) { + const Authorization = ctx.request.get('Authorization'); + if (!Authorization || Authorization === 'null') { + console.log('Authorization is null'); + return null; + } const id = getUserId(ctx); return ctx.db.query.user({ where: { id } }, info); }, diff --git a/backend/src/schema.graphql b/backend/src/schema.graphql index 993236e..8a2fa23 100644 --- a/backend/src/schema.graphql +++ b/backend/src/schema.graphql @@ -26,7 +26,8 @@ type Query { type Mutation { signup(email: String!, password: String!, name: String!): AuthPayload! - login(email: String!, password: String!): AuthPayload! + signin(email: String!, password: String!): AuthPayload! + requestReset(email: String!): User createDraft(title: String!, text: String!): Post! publish(id: ID!): Post! deletePost(id: ID!): Post! @@ -41,7 +42,6 @@ type AuthPayload { user: User! } -# THe user definition overrides type User { id: ID! email: String! @@ -49,4 +49,5 @@ type User { name: String! posts: [Post!]! age: Int + resetToken: String } diff --git a/backend/src/utils.js b/backend/src/utils.js index 35587db..642c04a 100644 --- a/backend/src/utils.js +++ b/backend/src/utils.js @@ -11,6 +11,15 @@ function getUserId(ctx) { throw new AuthError(); } +function checkForUserId(ctx) { + const Authorization = ctx.request.get('Authorization'); + if (Authorization) { + const token = Authorization.replace('Bearer ', ''); + const { userId } = jwt.verify(token, process.env.APP_SECRET); + return userId; + } +} + class AuthError extends Error { constructor() { super('Not authorized'); @@ -20,4 +29,5 @@ class AuthError extends Error { module.exports = { getUserId, AuthError, + checkForUserId, }; diff --git a/frontend/components/Header.js b/frontend/components/Header.js index 5624fb5..5e1a620 100644 --- a/frontend/components/Header.js +++ b/frontend/components/Header.js @@ -6,6 +6,7 @@ import Login from './LoginAuth0'; import Search from './Search'; import NProgress from 'nprogress'; import Router from 'next/router'; +import Signout from './Signout'; Router.onRouteChangeStart = url => { console.log(`Loading: ${url}`); @@ -23,20 +24,17 @@ class Header extends Component { } render() { - // const user = this.props.currentUserQuery.user || {}; - // const { email = '' } = user; return ( <div> - {/* <p> - Signed in as <strong>{email}</strong> - </p> */} + {this.props.currentUser.me ? this.props.currentUser.me.email : 'Not Signed in'} + <Signout /> {/* <Cart /> */} - <Search /> + {/* <Search /> */} </div> ); } } -const userEnhancer = graphql(CURRENT_USER_QUERY, { name: 'currentUserQuery' }); -// export default compose(userEnhancer)(Header); -export default Header; +const userEnhancer = graphql(CURRENT_USER_QUERY, { name: 'currentUser' }); +export default compose(userEnhancer)(Header); +// export default Header; diff --git a/frontend/components/Item.js b/frontend/components/Item.js index eb19918..d19af0e 100644 --- a/frontend/components/Item.js +++ b/frontend/components/Item.js @@ -1,10 +1,13 @@ -import styled from "styled-components"; -import slugify from "slugify"; -import { Link } from "../routes"; -import AddToCart from "./AddToCart"; -import makeImage from "../lib/image"; -import TakeMyMoney from "./TakeMyMoney"; -import formatMoney from "../lib/formatMoney"; +import React from 'react'; +import styled from 'styled-components'; +import slugify from 'slugify'; +import { compose } from 'react-apollo'; +import { Link } from '../routes'; +import AddToCart from './AddToCart'; +import makeImage from '../lib/image'; +import TakeMyMoney from './TakeMyMoney'; +import formatMoney from '../lib/formatMoney'; +import { removeItemMutation } from '../enhancers/enhancers'; const Item = styled.div` background: #f3f3f3; @@ -14,60 +17,53 @@ const Item = styled.div` } `; -const ItemComponent = ({ item }) => ( - <Item key={item.id}> - {item.image ? ( - <img - key={item.image.secret} - src={makeImage(item.image)} - alt={item.title} - /> - ) : null} - <h3> - <Link - route="item" - params={{ - slug: slugify(item.title), - itemId: item.id - }} - > - <a>{item.title}</a> - </Link> - </h3> +class ItemComponent extends React.Component { + removeItem = () => { + this.props.removeItem({ variables: { id: this.props.item.id } }); + }; + render() { + const item = this.props.item; + return ( + <Item key={item.id}> + {item.image ? <img key={item.image.secret} src={makeImage(item.image)} alt={item.title} /> : null} + <h3> + <Link + route="item" + params={{ + slug: slugify(item.title), + itemId: item.id, + }} + > + <a>{item.title}</a> + </Link> + </h3> - <p>{item.description}</p> - {/* { + <p>{item.description}</p> - <Link - href={{ - pathname: '/admin/update', - query: { id: item.id }, - }} - > - <a>Edit ✏️</a> - </Link> + <Link + href={{ + pathname: '/admin/update', + query: { id: item.id }, + }} + > + <a>Edit ✏️</a> + </Link> - } */} + <TakeMyMoney + id={item.id} + amount={item.price} + name={item.title} // the pop-in header title + description={item.description} // the pop-in header subtitle + image={makeImage(item.image)} + > + <button>Buy for {formatMoney(item.price)}</button> + </TakeMyMoney> - <TakeMyMoney - id={item.id} - amount={item.price} - name={item.title} // the pop-in header title - description={item.description} // the pop-in header subtitle - image={makeImage(item.image)} - > - <button>Buy for {formatMoney(item.price)}</button> - </TakeMyMoney> - - <AddToCart id={item.id} /> - <button - onClick={() => - this.props.removeItemMutation({ variables: { id: item.id } }) - } - > - × Delete item - </button> - </Item> -); + {/* <AddToCart id={item.id} /> */} + <button onClick={this.removeItem}>× Delete item</button> + </Item> + ); + } +} -export default ItemComponent; +export default compose(removeItemMutation)(ItemComponent); diff --git a/frontend/components/Items.js b/frontend/components/Items.js index 3e2c738..a3f98c9 100644 --- a/frontend/components/Items.js +++ b/frontend/components/Items.js @@ -1,11 +1,11 @@ -import { Component } from "react"; -import { withApollo, graphql, compose } from "react-apollo"; -import styled from "styled-components"; -import Pagination from "./Pagination"; -import Item from "./Item"; -import { itemEnhancer } from "../enhancers/enhancers"; +import { Component } from 'react'; +import { withApollo, graphql, compose } from 'react-apollo'; +import styled from 'styled-components'; +import Pagination from './Pagination'; +import Item from './Item'; +import { itemEnhancer } from '../enhancers/enhancers'; -import { ALL_ITEMS_QUERY, DELETE_ITEM_MUTATION } from "../queries"; +import { ALL_ITEMS_QUERY, DELETE_ITEM_MUTATION } from '../queries'; const Title = styled.h1` font-size: 10px; @@ -19,7 +19,6 @@ const Items = styled.div` class ItemList extends Component { componentDidMount() { - console.log(this.props.allItemsQuery); this.prefetchNextItems(this.props.page); } @@ -36,56 +35,35 @@ class ItemList extends Component { this.props.client.query({ query: ALL_ITEMS_QUERY, variables: { - skip: page * 3 - 3 - } + skip: page * 3 - 3, + }, }); }; render() { + console.log(this.props); // 1 - if (this.props.allItemsQuery && this.props.allItemsQuery.loading) { + if (this.props.itemsQuery && this.props.itemsQuery.loading) { return <div>Loading</div>; } // 2 - if (this.props.allItemsQuery && this.props.allItemsQuery.error) { - console.log(this.props.allItemsQuery.error); + if (this.props.itemsQuery && this.props.itemsQuery.error) { + console.log(this.props.itemsQuery.error); return <div>Error</div>; } - + console.log(this.props); // 3 - const itemsToRender = this.props.allItemsQuery.items; + const itemsToRender = this.props.itemsQuery.items; return ( <div> <Pagination page={this.props.page} /> <Title>Items For Sale</Title> - <Items key={this.props.page}> - {itemsToRender.map((item, i) => <Item key={item.id} item={item} />)} - </Items> + <Items key={this.props.page}>{itemsToRender.map((item, i) => <Item key={item.id} item={item} />)}</Items> </div> ); } } -// 1 - -// We export the graphQL HOC - this will fetch the data and inject it into the ItemList compeont via props - -const deleteItemEnhancer = graphql(DELETE_ITEM_MUTATION, { - name: "removeItemMutation", - options: { - update: (proxy, { data: { deleteItem } }) => { - // grab the data from our cache - const data = proxy.readQuery({ query: ALL_ITEMS_QUERY }); - - // filter out the deleted item - data.allItems = data.allItems.filter(item => item.id !== deleteItem.id); - - // and then "set state" (update cache), so it will update wherever we have used this data on the page - proxy.writeQuery({ query: ALL_ITEMS_QUERY, data }); - } - } -}); - -export default withApollo(compose(itemEnhancer, deleteItemEnhancer)(ItemList)); +export default withApollo(compose(itemEnhancer)(ItemList)); diff --git a/frontend/components/Page.js b/frontend/components/Page.js index ceb0939..291bdcd 100644 --- a/frontend/components/Page.js +++ b/frontend/components/Page.js @@ -1,8 +1,26 @@ -import styled from "styled-components"; -import Header from "./Header"; -import Meta from "./Meta"; -import Nav from "./Nav"; -import CartList from "./CartList"; +import styled from 'styled-components'; +import Header from './Header'; +import Meta from './Meta'; +import Nav from './Nav'; +import CartList from './CartList'; +import { Component } from 'react'; + +class ErrorBoundary extends Component { + state = { + error: null, + errorInfo: null, + }; + componentDidCatch(error, errorInfo) { + console.log('Caught an erorrror!'); + this.setState({ error, errorInfo }); + } + render() { + if (this.state.error) { + return <p>Shit! AN error!</p>; + } + return this.props.children; + } +} const StyledPage = styled.div` font-family: sans-serif; @@ -13,11 +31,13 @@ const StyledPage = styled.div` const Page = ({ children }) => ( <StyledPage className="main"> - <Meta /> - <Nav /> - {/* <Header /> */} - {/* <CartList /> */} - {children} + <ErrorBoundary> + <Meta /> + <Nav /> + <Header /> + {/* <CartList /> */} + {children} + </ErrorBoundary> </StyledPage> ); diff --git a/frontend/components/Pagination.js b/frontend/components/Pagination.js index 28785be..2cb5080 100644 --- a/frontend/components/Pagination.js +++ b/frontend/components/Pagination.js @@ -1,16 +1,16 @@ -import React, { Component } from "react"; -import { graphql, gql, compose } from "react-apollo"; -import { ALL_ITEMS_QUERY } from "../queries"; -import withData from "../lib/withData"; -import { Link } from "../routes"; -import { itemEnhancer } from "../enhancers/enhancers"; +import React, { Component } from 'react'; +import { graphql, gql, compose } from 'react-apollo'; +import { ALL_ITEMS_QUERY } from '../queries'; +import withData from '../lib/withData'; +import { Link } from '../routes'; +import { itemEnhancer } from '../enhancers/enhancers'; const Pagination = props => { - const { loading, error } = props.allItemsQuery; + const { loading, error } = props.itemsQuery; if (loading) return <p>Loading Item...</p>; - const { aggregate, pageInfo } = props.allItemsQuery.itemsConnection; + const { aggregate, pageInfo } = props.itemsQuery.itemsConnection; const { page } = props; const pages = Math.floor(aggregate.count / 3); diff --git a/frontend/components/RequestReset.js b/frontend/components/RequestReset.js new file mode 100644 index 0000000..de16751 --- /dev/null +++ b/frontend/components/RequestReset.js @@ -0,0 +1,71 @@ +import React, { Component } from 'react'; +import { graphql, compose } from 'react-apollo'; +import { REQUEST_RESET_MUTATION } from '../queries'; + +class ResetRequest extends Component { + state = { + email: `wesbos@gmail.com`, + password: 'abc123', + errors: [], + }; + + requestReset = async e => { + e.preventDefault(); + console.log(this.state.email); + const res = await this.props.requestReset({ + variables: { + email: this.state.email, + }, + }); + if (res.errors) { + this.setState({ errors: res.errors }); + } + console.log(res); + // // pull the values from state + // const { email, password } = this.state; + // this.setState({ loading: true, errors: [] }); + // const res = await this.props.signin({ + // // pass in those variables from state + // variables: { name, email, password }, + // }); + // if (res.errors) { + // this.setState({ errors: res.errors }); + // return; + // } + // localStorage.setItem('token', res.data.signin.token); + // // TODO refetch current user query + // this.props.currentUser.refetch(); + // this.setState({ loading: false }); + }; + + saveToState = e => { + const { name, value } = e.target; + this.setState({ [name]: value }); + }; + + render() { + return ( + <div> + {this.state.loading ? 'LOADING...' : 'Ready!'} + + {this.state.errors ? this.state.errors.map(err => <p>{err.message}</p>) : null} + <h2>Request a Reset</h2> + <form onSubmit={this.requestReset}> + <label htmlFor="email"> + Email + <input value={this.state.email} onChange={this.saveToState} name="email" type="text" placeholder="email" /> + </label> + + <button type="submit">Request Reset!</button> + </form> + </div> + ); + } +} + +// When we submit this mutation, we need to update our store - we have a few ways to do that: +// One - we can go nucular and run refetchQueries() which will just go get everything - this is easy, but at the cost of efficiency. + +const requestResetEnhancer = graphql(REQUEST_RESET_MUTATION, { name: 'requestReset' }); + +export default compose(requestResetEnhancer)(ResetRequest); diff --git a/frontend/components/Signin.js b/frontend/components/Signin.js new file mode 100644 index 0000000..aac1222 --- /dev/null +++ b/frontend/components/Signin.js @@ -0,0 +1,76 @@ +import React, { Component } from 'react'; +import { graphql, compose } from 'react-apollo'; +import { SIGNIN_MUTATION, CURRENT_USER_QUERY } from '../queries'; + +class Signin extends Component { + state = { + email: `wesbos@gmail.com`, + password: 'abc123', + errors: [], + }; + + loginUser = async e => { + e.preventDefault(); + // pull the values from state + const { email, password } = this.state; + this.setState({ loading: true, errors: [] }); + const res = await this.props.signin({ + // pass in those variables from state + variables: { name, email, password }, + }); + if (res.errors) { + this.setState({ errors: res.errors }); + return; + } + localStorage.setItem('token', res.data.signin.token); + // TODO refetch current user query + this.props.currentUser.refetch(); + + this.setState({ loading: false }); + }; + + saveToState = e => { + const { name, value } = e.target; + this.setState({ [name]: value }); + }; + + render() { + return ( + <div> + {this.state.loading ? 'LOADING...' : 'Ready!'} + + {this.state.errors ? this.state.errors.map(err => <p>{err.message}</p>) : null} + + <form onSubmit={this.loginUser}> + <label htmlFor="email"> + Email + <input value={this.state.email} onChange={this.saveToState} name="email" type="text" placeholder="email" /> + </label> + + <label htmlFor="password"> + Password + <input + type="password" + name="password" + id="password" + className="password" + placeholder="password" + value={this.state.password} + onChange={this.saveToState} + /> + </label> + + <button type="submit">Sign In!</button> + </form> + </div> + ); + } +} + +// When we submit this mutation, we need to update our store - we have a few ways to do that: +// One - we can go nucular and run refetchQueries() which will just go get everything - this is easy, but at the cost of efficiency. + +const userEnhancer = graphql(CURRENT_USER_QUERY, { name: 'currentUser' }); +const signinEnhancer = graphql(SIGNIN_MUTATION, { name: 'signin' }); + +export default compose(signinEnhancer, userEnhancer)(Signin); diff --git a/frontend/components/Signout.js b/frontend/components/Signout.js new file mode 100644 index 0000000..97eef40 --- /dev/null +++ b/frontend/components/Signout.js @@ -0,0 +1,20 @@ +import React, { Component } from 'react'; +import { graphql, compose } from 'react-apollo'; +import { CURRENT_USER_QUERY } from '../queries'; + +class Signout extends Component { + signout = () => { + console.log('Signing Out'); + localStorage.removeItem('token'); + this.props.currentUser.refetch(); + }; + + render() { + const { me, loading, error } = this.props.currentUser; + if (!me || loading || error) return null; + return <button onClick={this.signout}>Sign Out of {me.id}👋 🏻</button>; + } +} + +const userEnhancer = graphql(CURRENT_USER_QUERY, { name: 'currentUser' }); +export default compose(userEnhancer)(Signout); diff --git a/frontend/components/Signup.js b/frontend/components/Signup.js index 57e2569..746f1e4 100644 --- a/frontend/components/Signup.js +++ b/frontend/components/Signup.js @@ -1,94 +1,92 @@ import React, { Component } from 'react'; -import { graphql, gql } from 'react-apollo'; -import { CREATE_USER_MUTATION } from '../queries'; +import { graphql, compose } from 'react-apollo'; +import { SIGNUP_MUTATION, CURRENT_USER_QUERY } from '../queries'; class Signup extends Component { - constructor() { - super(); - const idToken = typeof window !== 'undefined' ? localStorage.getItem('auth0IdToken') || '' : ''; - this.state = { - email: '', - name: '', - idToken, - error: undefined, - }; - } + state = { + email: `wesbos+${Date.now()}@gmail.com`, + name: 'Wes Bos', + password: 'abc123', + error: undefined, + }; + + createUser = async e => { + e.preventDefault(); + // pull the values from state + const { email, name, password } = this.state; + // create a mutation + // TODO: handle any errors + // turn loading on + this.setState({ loading: true }); + console.log({ name, email, password }); + try { + const res = await this.props.signup({ + // pass in those variables from state + variables: { name, email, password }, + }); + localStorage.setItem('token', res.data.signup.token); + // TODO refetch current user query + this.props.currentUser.refetch(); + } catch (error) { + this.setState({ error }); + console.dir(error); + } + this.setState({ loading: false }); + }; + + saveToState = e => { + const { name, value } = e.target; + this.setState({ [name]: value }); + }; render() { return ( <div> {this.state.loading ? 'LOADING...' : 'Ready!'} - {this.state.error ? <p>{this.state.error.message}</p> : ''} + {this.state.error ? <p>{this.state.error.message}</p> : null} - <form onSubmit={this._createUser}> - <p> + <form onSubmit={this.createUser}> + <label htmlFor="email"> Email - <input - value={this.state.email} - onChange={e => this.setState({ email: e.target.value })} - type="text" - placeholder="email" - /> - </p> + <input value={this.state.email} onChange={this.saveToState} name="email" type="text" placeholder="email" /> + </label> - <p> + <label htmlFor="name"> Name - <input - value={this.state.name} - onChange={e => this.setState({ name: e.target.value })} - type="text" - placeholder="name" - /> - </p> + <input type="text" name="name" placeholder="name" value={this.state.name} onChange={this.saveToState} /> + </label> - <p> - idToken + <label htmlFor="password"> + Password <input - disabled - value={this.state.idToken} - onChange={e => this.setState({ idToken: e.target.value })} - type="text" - placeholder="name" + type="password" + name="password" + id="password" + className="password" + placeholder="password" + value={this.state.password} + onChange={this.saveToState} /> - </p> + </label> <button type="submit">Submit</button> </form> </div> ); } - - _createUser = async e => { - e.preventDefault(); - // pull the values from state - const { email, name, idToken } = this.state; - // create a mutation - // TODO: handle any errors - // turn loading on - this.setState({ loading: true }); - console.log(name, email, idToken); - try { - const res = await this.props.createUserMutation({ - // pass in those variables from state - variables: { name, email, idToken }, - }); - } catch (error) { - this.setState({ error }); - console.dir(error); - } - this.setState({ loading: false }); - }; } + // When we submit this mutation, we need to update our store - we have a few ways to do that: // One - we can go nucular and run refetchQueries() which will just go get everything - this is easy, but at the cost of efficiency. -export default graphql(CREATE_USER_MUTATION, { - name: 'createUserMutation', +const userEnhancer = graphql(CURRENT_USER_QUERY, { name: 'currentUser' }); + +const signupEnhancer = graphql(SIGNUP_MUTATION, { + name: 'signup', options: { - // Easy, but slow - // refetchQueries: ['AllLinksQuery'] - // This is much Better / efficient - // Notice how the variable is called createItem - that is because createItem is the name of the query! + refetchQueries: ['currentUser'], }, -})(Signup); +}); + +export default compose(userEnhancer, signupEnhancer)(Signup); diff --git a/frontend/components/SingleItem.js b/frontend/components/SingleItem.js index 297c33d..9d18074 100644 --- a/frontend/components/SingleItem.js +++ b/frontend/components/SingleItem.js @@ -1,36 +1,22 @@ import { graphql, compose } from 'react-apollo'; -import { Motion, spring } from 'react-motion'; import { SINGLE_ITEM_QUERY } from '../queries'; +import { singleItemEnhancer } from '../enhancers/enhancers'; import makeImage from '../lib/image'; const SingleItem = props => { - if (!props.findItem.Item) return <p>Not ready</p>; - console.log(props.findItem.Item); - - if (props.loading) return <p>Loading...</p>; + if (props.loading || !props.item) return <p>Loading...</p>; if (props.error) return <p>Error...</p>; - - const item = props.findItem.Item; + console.log(props); + const item = props.findItem.items[0]; return ( <div> <img src={makeImage(item.image)} alt={item.title} /> <h2>Viewing {item.title}</h2> - - <Motion defaultStyle={{ x: 0 }} style={{ x: spring(100) }}> - {value => <div>{value.x}</div>} - </Motion> + <p>{item.description}</p> </div> ); }; -const ComponentWithMutations = compose( - graphql(SINGLE_ITEM_QUERY, { - name: 'findItem', - // This comes from Props - options: ({ id }) => ({ - variables: { id }, - }), - }) -)(SingleItem); +const ComponentWithMutations = compose(singleItemEnhancer)(SingleItem); export default ComponentWithMutations; diff --git a/frontend/components/TakeMyMoney.js b/frontend/components/TakeMyMoney.js index d68cca1..042e9c8 100644 --- a/frontend/components/TakeMyMoney.js +++ b/frontend/components/TakeMyMoney.js @@ -1,25 +1,25 @@ import { Component } from 'react'; import StripeCheckout from 'react-stripe-checkout'; -import { CREATE_ORDER_MUTATION, CURRENT_USER_QUERY } from '../queries'; import { graphql, compose } from 'react-apollo'; - +import { CREATE_ORDER_MUTATION, CURRENT_USER_QUERY } from '../queries'; class TakeMyMoney extends Component { - onToken = async (res) => { + onToken = async res => { + console.log('We got a toooken!'); const token = res.id; const userId = this.props.currentUserQuery.user.id; const itemId = this.props.id; console.log(`Going to make a purchase with ${token}`); - console.log(`THe person that bought this was ${userId}`) - console.log(`The item id is ${itemId}`) - const charge = await this.props.createOrder({ variables: { token, userId, itemId }}); + console.log(`THe person that bought this was ${userId}`); + console.log(`The item id is ${itemId}`); + const charge = await this.props.createOrder({ variables: { token, userId, itemId } }); alert(`Back from the charge! ${charge.id}`); console.log(charge); - - } + }; render() { - const user = this.props.currentUserQuery.user || {}; - const email = user.email || ''; + // const user = this.props.currentUserQuery.user || {}; + // const email = user.email || ''; + const email = 'wesbos@gmail.com'; return ( <div> <StripeCheckout @@ -34,10 +34,10 @@ class TakeMyMoney extends Component { {this.props.children} </StripeCheckout> </div> - ) + ); } } const userEnhancer = graphql(CURRENT_USER_QUERY, { name: 'currentUserQuery' }); const createOrderEnhancer = graphql(CREATE_ORDER_MUTATION, { name: 'createOrder' }); -export default compose(userEnhancer, createOrderEnhancer)(TakeMyMoney); +export default compose(createOrderEnhancer)(TakeMyMoney); diff --git a/frontend/components/UpdateItem.js b/frontend/components/UpdateItem.js index 27be90f..febe2ad 100644 --- a/frontend/components/UpdateItem.js +++ b/frontend/components/UpdateItem.js @@ -2,58 +2,75 @@ import React, { Component } from 'react'; import { graphql, gql, compose } from 'react-apollo'; import { SINGLE_ITEM_QUERY, UPDATE_LINK_MUTATION } from '../queries'; -class UpdateLink extends Component { +import { singleItemEnhancer } from '../enhancers/enhancers'; + +class UpdateItem extends Component { state = { - ...this.props.findItem.Item, + item: {}, }; + componentDidMount() { + console.log(this.props); + } saveToState = e => { let { name, value, type } = e.target; if (type === 'number') { value = parseInt(value); } - - this.setState({ [name]: value }); + console.log('Saving to state'); + const item = { ...this.state.item }; + item[name] = value; + this.setState({ item }); }; - _createLink = async e => { + updateItem = async e => { e.preventDefault(); // pull the values from state const { description, title } = this.state; const { id } = this.props; // create a mutation - // TODO: handle any errors + // TODO: handle any errors. If you send an extra field it should break -how do we display those errors if they are currently only visible via the network tab? // turn loading on this.setState({ loading: true }); - console.log(this.state); const res = await this.props.updateItem({ // pass in those variables from state variables: { - ...this.state, + ...this.props.findItem.items[0], + ...this.state.item, }, }); + console.log(res); this.setState({ loading: false }); }; render() { + if (this.props.findItem.loading) { + return <p>Loading...</p>; + } + + const item = this.props.findItem.items[0]; return ( <div> <h2>Edit {this.props.id}</h2> {this.state.loading ? 'LOADING...' : 'Ready!'} - <form onSubmit={this._createLink}> - <label htmlFor="title">Title</label> - <input value={this.state.title} name="title" onChange={this.saveToState} type="text" /> - - <label htmlFor="description">Description</label> - <textarea value={this.state.description} name="description" onChange={this.saveToState} /> - - <label htmlFor="price">Price</label> - <input type="number" name="price" onChange={this.saveToState} value={this.state.price} /> + <form onSubmit={this.updateItem}> + <fieldset disabled={this.state.loading}> + <label htmlFor="title"> + Title + <input id="title" defaultValue={item.title} name="title" onChange={this.saveToState} type="text" /> + </label> - <label htmlFor="fullPrice">Full Price</label> - <input type="number" name="fullPrice" onChange={this.saveToState} value={this.state.fullPrice} /> + <label htmlFor="description"> + Description + <textarea defaultValue={item.description} name="description" onChange={this.saveToState} /> + </label> - <button type="submit">Save...</button> + <label htmlFor="price"> + Price + <input type="number" name="price" onChange={this.saveToState} defaultValue={item.price} /> + </label> + <button type="submit">Save...</button> + </fieldset> </form> </div> ); @@ -61,15 +78,9 @@ class UpdateLink extends Component { } const ComponentWithMutations = compose( - // First, query for getting the link - graphql(SINGLE_ITEM_QUERY, { - name: 'findItem', - options: ({ id }) => ({ - variables: { id }, - }), - }), + singleItemEnhancer, // Second, the mutation for updating the link graphql(UPDATE_LINK_MUTATION, { name: 'updateItem' }) -)(UpdateLink); +)(UpdateItem); export default ComponentWithMutations; diff --git a/frontend/enhancers/enhancers.js b/frontend/enhancers/enhancers.js index 525c720..ff1712f 100644 --- a/frontend/enhancers/enhancers.js +++ b/frontend/enhancers/enhancers.js @@ -1,13 +1,37 @@ -import { ALL_ITEMS_QUERY } from "../queries/index"; -import { graphql } from "react-apollo"; +import { ALL_ITEMS_QUERY, REMOVE_ITEM_MUTATION, SINGLE_ITEM_QUERY } from '../queries/index'; +import { graphql } from 'react-apollo'; export const itemEnhancer = graphql(ALL_ITEMS_QUERY, { - name: "allItemsQuery", + name: 'itemsQuery', options({ page }) { return { variables: { - skip: page * 3 - 3 - } + skip: page * 3 - 3, + }, }; - } + }, +}); + +export const removeItemMutation = graphql(REMOVE_ITEM_MUTATION, { + name: 'removeItem', + options: { + update: (proxy, { data: { deleteItem } }) => { + // grab the data from our cache + const data = proxy.readQuery({ query: ALL_ITEMS_QUERY }); + console.log(data); + // filter out the deleted item + data.items = data.items.filter(item => item.id !== deleteItem.id); + + // and then "set state" (update cache), so it will update wherever we have used this data on the page + proxy.writeQuery({ query: ALL_ITEMS_QUERY, data }); + }, + }, +}); + +export const singleItemEnhancer = graphql(SINGLE_ITEM_QUERY, { + name: 'findItem', + // This comes from Props + options: ({ id }) => ({ + variables: { id }, + }), }); diff --git a/frontend/lib/initApollo.js b/frontend/lib/initApollo.js index 35f5e08..7252a00 100644 --- a/frontend/lib/initApollo.js +++ b/frontend/lib/initApollo.js @@ -17,7 +17,6 @@ function create(initialState) { // 1. Create a link for local state to be managed in Apollo - // 1. connect to our GraphQL API const httpLink = new HttpLink({ uri: endpoint, // Server URL (must be absolute) @@ -28,11 +27,13 @@ function create(initialState) { // 2. One to tack on our auth token on each request const authMiddleware = new ApolloLink((operation, forward) => { + console.log('Adding Auth'); const headers = {}; - if (typeof localStorage !== 'undefined' && localStorage.getItem('auth0IdToken')) { - headers.authorization = `Bearer ${localStorage.getItem('auth0IdToken')}`; + if (typeof localStorage !== 'undefined' && localStorage.getItem('token')) { + headers.authorization = `Bearer ${localStorage.getItem('token')}`; } + console.log({ headers }); operation.setContext({ headers }); return forward(operation); @@ -43,6 +44,10 @@ function create(initialState) { ssrMode: !process.browser, // Disables forceFetch on the server (so queries are only run once) link: concat(authMiddleware, httpLink), cache: new InMemoryCache().restore(initialState || {}), + defaultOptions: { + query: { errorPolicy: 'all' }, + mutate: { errorPolicy: 'all' }, + }, }); } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index eed2f28..1cbed1a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.38", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz", - "integrity": "sha512-JNHofQND7Iiuy3f6RXSillN1uBe87DAp+1ktsBfSxfL3xWeGFyJC9jH5zu2zs7eqVGp2qXWvJZFiJIwOYnaCQw==", + "version": "7.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.39.tgz", + "integrity": "sha512-PConL+YIK9BgNUWWC2q4fbltj1g475TofpNVNivSypcAAKElfpSS1cv7MrpLYRG8TzZvwcVu9M30hLA/WAp1HQ==", "dev": true, "requires": { "chalk": "2.3.0", @@ -16,28 +16,21 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0-beta.38", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.38.tgz", - "integrity": "sha512-7k67bppxvfSS+hu2yiDeuVTf8GHOlz8haHwRJZDXiXwjm2IBqEYYA6Dvi+xNMHy05pZVBy012qpS7BpguXoW4A==", + "version": "7.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.39.tgz", + "integrity": "sha512-q+rE/5K8dTi5FYhG4iOsh11BTgEP8FvQ/zVInOezcihPUUJxpi5t9t3bi/SGooIIoYQdwSL4/bo5s6Yl4ZoMcA==", "requires": { - "@babel/types": "7.0.0-beta.38" + "@babel/types": "7.0.0-beta.39" } }, "@babel/types": { - "version": "7.0.0-beta.38", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.38.tgz", - "integrity": "sha512-SAtyEjmA7KiEoL2eAOAUM6M9arQJGWxJKK0S9x0WyPOosHS420RXoxPhn57u/8orRnK8Kxm0nHQQNTX203cP1Q==", + "version": "7.0.0-beta.39", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.39.tgz", + "integrity": "sha512-wrEe0z4kFP0KbFz8aHbPOGQal0gn+J2Iv9ZJGYbD77JN4BpavbF5l/BvLNZ0Omn665VENncoLVmQpclMbh64sQ==", "requires": { "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "to-fast-properties": "2.0.0" - }, - "dependencies": { - "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=" - } } }, "@semantic-release/commit-analyzer": { @@ -46,10 +39,10 @@ "integrity": "sha512-bxCvvDsZeQp6Fvev8CdAV4pu9rEt8NOuLIFS0E8RLjKRnqQVL/fGAwpQWnRQ5hc08UZroguBNEENWpKBubWmKQ==", "requires": { "@semantic-release/error": "2.1.0", - "conventional-changelog-angular": "1.6.0", - "conventional-commits-parser": "2.1.0", + "conventional-changelog-angular": "1.6.2", + "conventional-commits-parser": "2.1.1", "import-from": "2.1.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "pify": "3.0.0" }, "dependencies": { @@ -93,11 +86,11 @@ "integrity": "sha512-LznqPnifl8jtQkV5ZXnQbqMLx9QROoX5d/FLteLyKy3AznLSubm5rH0LndKvf9ZI8XU8jwgLYu+wbLAEIR2PPg==", "requires": { "@semantic-release/error": "2.1.0", - "conventional-changelog-angular": "1.6.0", + "conventional-changelog-angular": "1.6.2", "conventional-changelog-core": "1.9.5", "get-stream": "3.0.0", "import-from": "2.1.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "pify": "3.0.0" }, "dependencies": { @@ -114,9 +107,9 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" }, "@types/async": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.46.tgz", - "integrity": "sha512-G4pYI5fcrmy6/NpTUHxTV8KOJgt7xO4jU7Itx3hA+AsBiECf78vFIJdRSWM6pHIskmKfCmJ0zGVbQJuKUooEQg==", + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.47.tgz", + "integrity": "sha512-/mQMARXVSuGbwOFFBKA4s0qRKtOaaTgnllp3qU4sMzDVGGAroPblyd529yBALnK/WEY8nHyRGx0/RFUDmhpVmQ==", "optional": true }, "@types/zen-observable": { @@ -154,9 +147,9 @@ } }, "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==" }, "acorn-dynamic-import": { "version": "2.0.2", @@ -179,7 +172,7 @@ "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "dev": true, "requires": { - "acorn": "5.3.0" + "acorn": "5.4.1" } }, "agent-base": { @@ -278,43 +271,36 @@ } }, "apollo-cache": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.0.tgz", - "integrity": "sha512-ILs1/GCyAv8RRMansOqpENnsJMCc1w6UQKVY6vTxJBpUDpGO6B6/UbIaWM0esat9cf92a7yx13/BoauFRzwqzw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.2.tgz", + "integrity": "sha512-U0xObyjvHcnOIQ1KMWGgVM0tzkWChh7xwxO3QmEGJBHr78f7LstBfMsY5KlK/4PbwOoTqrOBf8L6aCs4BSHx/A==", "requires": { - "apollo-utilities": "1.0.4" + "apollo-utilities": "1.0.6" } }, "apollo-cache-inmemory": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.1.5.tgz", - "integrity": "sha512-Gy9g4RZUfIJwxaZuMF3ZqplYaiFSfgJYmepYTIP+zL+9dqV1Er8EIICJqVlc4T2uWXHQ9U01iK5Hu1g9pV85tg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.1.7.tgz", + "integrity": "sha512-qckP7ptk03qvk1UR1/tiy+vVswFyF2Ix06T53RxWLCeWuXvFfEM0mzmcAwGA0Rh3qC3p/GkQTmADJ/9pnltCkg==", "requires": { - "apollo-cache": "1.1.0", - "apollo-utilities": "1.0.4", - "graphql-anywhere": "4.1.1" + "apollo-cache": "1.1.2", + "apollo-utilities": "1.0.6", + "graphql-anywhere": "4.1.3" } }, "apollo-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.2.0.tgz", - "integrity": "sha512-PSocHEbRoubHIV+GD/bHMACFstbEv9a4FLgu41d2djpwAIIiT37qgnfLbnvY7BlME0vKc7HIV6sYjLY3xnjY4Q==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.2.2.tgz", + "integrity": "sha512-ljV1JN4fWy2lW5kz4wSFqe4IT33rNNJmOMRSJ6V/VkZxxj4V2vwrm/YYpwQTZfXOPikTdUxi5GM9NvN1tbRI7w==", "requires": { - "@types/async": "2.0.46", + "@types/async": "2.0.47", "@types/zen-observable": "0.5.3", - "apollo-cache": "1.1.0", + "apollo-cache": "1.1.2", "apollo-link": "1.0.7", "apollo-link-dedup": "1.0.5", - "apollo-utilities": "1.0.4", - "symbol-observable": "1.1.0", + "apollo-utilities": "1.0.6", + "symbol-observable": "1.2.0", "zen-observable": "0.7.1" - }, - "dependencies": { - "zen-observable": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.7.1.tgz", - "integrity": "sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg==" - } } }, "apollo-link": { @@ -323,8 +309,15 @@ "integrity": "sha512-oHzvpIDEy4UCNdbOw42wtOK1zOzdMrt4ulYyon24zT24MjicezTmXqJh2mR6whTl8RiUDLDY4ByusdKKXdcqHw==", "requires": { "@types/zen-observable": "0.5.3", - "apollo-utilities": "1.0.4", + "apollo-utilities": "1.0.6", "zen-observable": "0.6.1" + }, + "dependencies": { + "zen-observable": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.6.1.tgz", + "integrity": "sha512-DKjFTL7siVLIUMZOFZ0alqMEdTsXPUxoCZzrvB2tdWEVN/6606Qh1nCfSTCAOZMrtcPzzFI3BXmwBKLAew52NA==" + } } }, "apollo-link-dedup": { @@ -344,18 +337,18 @@ } }, "apollo-link-state": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/apollo-link-state/-/apollo-link-state-0.3.1.tgz", - "integrity": "sha512-NjoQ5xAHqOOavcmSmEsJHZsQFiEV7U5YRke7ez5GUJ5U0oV7njE6qtFemLJ1emyaH8FPSN5bUzaDN/jSIqQjuQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/apollo-link-state/-/apollo-link-state-0.4.0.tgz", + "integrity": "sha512-hzty8lhdmbaZXaW7ZGKYzCXQrkjxtBsi2ZmtXHbnAvWWIIE/RhSqU1iTLR/b0rKvBw6E+jI7arX8iUkQzK9j/g==", "requires": { - "apollo-utilities": "1.0.4", - "graphql-anywhere": "4.1.1" + "apollo-utilities": "1.0.6", + "graphql-anywhere": "4.1.3" } }, "apollo-utilities": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.4.tgz", - "integrity": "sha512-QnxSxRuJLCpa91P2Tzi3PCdpPydpBEawsHedr/hW7QrgOpn1fOicxgVrzhxt/au9rXSopwyDTBsGa7wEvz+DQQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.6.tgz", + "integrity": "sha512-3EUdGs19ZU5hN0zPF0h27blkd4aFqFxF0Qkec8o7iPFzxFeEf0UJGPg/b1St417K7Rta6/EDq2cYBQEzvOVq1g==" }, "append-transform": { "version": "0.4.0", @@ -487,9 +480,9 @@ } }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -502,9 +495,12 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.5" + } }, "async-each": { "version": "1.0.1", @@ -528,9 +524,9 @@ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" }, "auth0-js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.1.0.tgz", - "integrity": "sha1-Gevm5NX3jbH3dw+BOlYSiKGeqw8=", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.2.1.tgz", + "integrity": "sha1-EQbYbrojdP9HdqQTdnH1dPr/YzI=", "requires": { "base64-js": "1.2.1", "idtoken-verifier": "1.1.1", @@ -541,11 +537,11 @@ } }, "auth0-lock": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/auth0-lock/-/auth0-lock-11.1.0.tgz", - "integrity": "sha1-tdeqja+Db/vjfNEMY1VW+zKzdPU=", + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/auth0-lock/-/auth0-lock-11.2.2.tgz", + "integrity": "sha1-D1JM0BXCOkjDOxyhAKjLv8d/Ryc=", "requires": { - "auth0-js": "9.1.0", + "auth0-js": "9.2.1", "blueimp-md5": "2.3.1", "fbjs": "0.3.2", "idtoken-verifier": "1.1.1", @@ -565,7 +561,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { - "create-react-class": "15.6.2", + "create-react-class": "15.6.3", "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1", @@ -618,9 +614,9 @@ } }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.6.0", @@ -680,7 +676,7 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", "babel-register": "6.26.0", @@ -692,7 +688,7 @@ "convert-source-map": "1.5.1", "debug": "2.6.9", "json5": "0.5.1", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", @@ -711,16 +707,16 @@ } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { "babel-messages": "6.23.0", "babel-runtime": "6.26.0", "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "source-map": "0.5.7", "trim-right": "1.0.1" } @@ -764,7 +760,7 @@ "babel-helper-function-name": "6.24.1", "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-helper-explode-assignable-expression": { @@ -823,7 +819,7 @@ "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-helper-remap-async-to-generator": { @@ -944,9 +940,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.5.0.tgz", "integrity": "sha1-RUnyihn7BRcKqe5Cm03g6sLSQB0=", "requires": { - "@babel/helper-annotate-as-pure": "7.0.0-beta.38", + "@babel/helper-annotate-as-pure": "7.0.0-beta.39", "babel-types": "6.26.0", - "stylis": "3.4.5" + "stylis": "3.4.8" } }, "babel-plugin-syntax-async-functions": { @@ -1035,7 +1031,7 @@ "babel-template": "6.26.0", "babel-traverse": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-plugin-transform-es2015-classes": { @@ -1396,7 +1392,7 @@ "babel-runtime": "6.26.0", "core-js": "2.5.3", "home-or-tmp": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "mkdirp": "0.5.1", "source-map-support": "0.4.18" }, @@ -1433,7 +1429,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-traverse": { @@ -1449,7 +1445,7 @@ "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.2", - "lodash": "4.17.4" + "lodash": "4.17.5" }, "dependencies": { "debug": { @@ -1469,8 +1465,15 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "to-fast-properties": "1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + } } }, "babylon": { @@ -1569,11 +1572,11 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "2.16.3" + "hoek": "4.2.0" } }, "boxen": { @@ -1714,8 +1717,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "1.0.30000792", - "electron-to-chromium": "1.3.31" + "caniuse-lite": "1.0.30000803", + "electron-to-chromium": "1.3.32" } }, "bser": { @@ -1839,9 +1842,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz", - "integrity": "sha1-0M6pgfgRjzlhRxr7tDyaHlu/AzI=" + "version": "1.0.30000803", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz", + "integrity": "sha512-AoROHIFLv2iv5CG4nonOfT9ZCQ3JTN0GyEn8LG2sPb2Wc5cIyX/UwLYP0pnVajVF3LWH+mrO/DXBzmte0BK9cQ==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.1.1", @@ -1849,9 +1852,9 @@ "integrity": "sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk=" }, "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", @@ -2094,6 +2097,171 @@ "commander": "2.9.0", "lcov-parse": "0.0.10", "request": "2.79.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "1.1.3", + "commander": "2.9.0", + "is-my-json-valid": "2.17.1", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + } } }, "collection-visit": { @@ -2212,9 +2380,9 @@ "dev": true }, "conventional-changelog-angular": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.0.tgz", - "integrity": "sha1-CiagcfLJ/PzyuGugz79uYwG3W/o=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.2.tgz", + "integrity": "sha512-LiGZkMJOCJFLNzDlZo3f+DpblcDSzsaYHUWhC+kzsqq+no4qwDP3uW0HVIHueXT4jJDhYNaE9t/XCD7vu7xR1g==", "requires": { "compare-func": "1.3.2", "q": "1.5.1" @@ -2226,13 +2394,13 @@ "integrity": "sha1-XbdWba18DLddr0f7spdve/mSjB0=", "requires": { "conventional-changelog-writer": "2.0.3", - "conventional-commits-parser": "2.1.0", + "conventional-commits-parser": "2.1.1", "dateformat": "1.0.12", "get-pkg-repo": "1.4.0", "git-raw-commits": "1.3.0", "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.2.3", - "lodash": "4.17.4", + "git-semver-tags": "1.3.0", + "lodash": "4.17.5", "normalize-package-data": "2.4.0", "q": "1.5.1", "read-pkg": "1.1.0", @@ -2250,7 +2418,7 @@ "dateformat": "1.0.12", "handlebars": "4.0.11", "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", + "lodash": "4.17.5", "meow": "3.7.0", "semver": "5.5.0", "split": "1.0.1", @@ -2267,13 +2435,13 @@ } }, "conventional-commits-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.0.tgz", - "integrity": "sha512-8MD05yN0Zb6aRsZnFX1ET+8rHWfWJk+my7ANCJZBU2mhz7TSB1fk2vZhkrwVy/PCllcTYAP/1T1NiWQ7Z01mKw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.1.tgz", + "integrity": "sha512-Qqxaul7TELPnTrm7KhWGjVTFTs7T9yUblzXugtXEff2C2uXFK4S0uVGqsyX7feQZzoFbXnJ1KdEs+IMmSxGbqQ==", "requires": { "JSONStream": "1.3.2", "is-text-path": "1.0.1", - "lodash": "4.17.4", + "lodash": "4.17.5", "meow": "3.7.0", "split2": "2.2.0", "through2": "2.0.3", @@ -2349,9 +2517,9 @@ } }, "create-react-class": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", @@ -2385,11 +2553,21 @@ } }, "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "2.10.1" + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } } }, "crypto-browserify": { @@ -2432,9 +2610,9 @@ } }, "css-to-react-native": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.0.4.tgz", - "integrity": "sha1-z0zEB1WLNHTUuovhos07bOcTEBs=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.1.1.tgz", + "integrity": "sha512-TrP3FRQ1AOhuElnUD4/I/Fd4HuSvnUH2KOmF0aYLjxbAX2kTd/WRUW3TuGkrsJwAGxNyYx8e/oaMSEKQKarrGQ==", "requires": { "css-color-keywords": "1.0.0", "fbjs": "0.8.16", @@ -2507,13 +2685,6 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "date-now": { @@ -2714,9 +2885,9 @@ "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { "version": "1.3.0", @@ -2763,9 +2934,9 @@ "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" }, "downshift": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-1.25.0.tgz", - "integrity": "sha512-oYpEdGPW9BLuM6s1pmKtAi1eKxiCL7O+1t7U4Ai1zdfUb9UHT0Gsa3bw7x07CHBACT90MMV2gFzwql1swPWSng==" + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-1.27.1.tgz", + "integrity": "sha512-rhvkL3VtVLIP1PafWnrSxe6ab0zeQ4PvdBhbmDeWFcAxsU4hwYmU8H+OOYJPRHQz19Zw4HoeN+BNeQV+BfUgnw==" }, "duplexer3": { "version": "0.1.4", @@ -2787,9 +2958,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz", - "integrity": "sha512-XE4CLbswkZgZFn34cKFy1xaX+F5LHxeDLjY1+rsK9asDzknhbrd9g/n/01/acbU25KTsUSiLKwvlLyA+6XLUOA==" + "version": "1.3.32", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz", + "integrity": "sha1-EdBoTAhA4APEvoko+KxfNdvCtOY=" }, "elliptic": { "version": "6.4.0", @@ -2925,16 +3096,16 @@ } }, "es6-promise": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz", - "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "4.2.2" + "es6-promise": "4.2.4" } }, "es6-set": { @@ -3369,9 +3540,9 @@ } }, "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.0.tgz", + "integrity": "sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw==" }, "fill-range": { "version": "4.0.0", @@ -4489,13 +4660,6 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "git-head": { @@ -4538,9 +4702,9 @@ } }, "git-semver-tags": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.2.3.tgz", - "integrity": "sha1-GItFOIK/nXojr9Mbq6U32rc4jV0=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.0.tgz", + "integrity": "sha1-sVSDOmq1w2DArTsaqbjxLqBt6Rk=", "requires": { "meow": "3.7.0", "semver": "5.5.0" @@ -4562,7 +4726,7 @@ "dotenv": "4.0.0", "follow-redirects": "1.2.6", "https-proxy-agent": "2.1.1", - "lodash": "4.17.4", + "lodash": "4.17.5", "mime": "2.2.0", "netrc": "0.1.4" }, @@ -4723,11 +4887,11 @@ } }, "graphql-anywhere": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/graphql-anywhere/-/graphql-anywhere-4.1.1.tgz", - "integrity": "sha512-CMbuqNbp6nfHfOHswrDuEed+MxDSnLppHKjjte447P6fllqZi69D2bS/3QSfK/KONSgvpk3ptxNi4fR6WQFcSQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graphql-anywhere/-/graphql-anywhere-4.1.3.tgz", + "integrity": "sha512-WYdNIRANlQrc0H1Dt9GkSWKthERSetjx6rKcPUTkhnhmqCzqlZ0K/KVBqhAQ7sqhV9d0m3BeiB5y2HqAkg4mIg==", "requires": { - "apollo-utilities": "1.0.4" + "apollo-utilities": "1.0.6" } }, "graphql-tag": { @@ -4752,6 +4916,28 @@ "uglify-js": "2.8.29" }, "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", @@ -4759,61 +4945,58 @@ "requires": { "amdefine": "1.0.1" } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "is-my-json-valid": "2.17.1", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has": { @@ -4914,14 +5097,14 @@ } }, "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" } }, "hmac-drbg": { @@ -4935,9 +5118,9 @@ } }, "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, "hoist-non-react-statics": { "version": "2.3.1", @@ -5048,11 +5231,11 @@ } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "0.2.0", + "assert-plus": "1.0.0", "jsprim": "1.4.1", "sshpk": "1.13.1" } @@ -5516,17 +5699,6 @@ "js-yaml": "3.10.0", "mkdirp": "0.5.1", "once": "1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - } } }, "istanbul-lib-coverage": { @@ -5550,7 +5722,7 @@ "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-template": "6.26.0", "babel-traverse": "6.26.0", "babel-types": "6.26.0", @@ -5888,7 +6060,7 @@ "requires": { "jest-mock": "22.1.0", "jest-util": "22.1.4", - "jsdom": "11.6.0" + "jsdom": "11.6.2" } }, "jest-environment-node": { @@ -6028,7 +6200,7 @@ "jest-matcher-utils": "22.1.0", "jest-message-util": "22.1.0", "jest-snapshot": "22.1.2", - "source-map-support": "0.5.2" + "source-map-support": "0.5.3" }, "dependencies": { "source-map": { @@ -6038,9 +6210,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.2.tgz", - "integrity": "sha512-9zHceZbQwERaMK1MiFguvx1dL9GQPLXInr2D/wUxAsuV6ZKc9F0DHYWeloMcalkYRbtanwqUakoDjvj55cL/4A==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", + "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==", "dev": true, "requires": { "source-map": "0.6.1" @@ -6074,7 +6246,7 @@ "integrity": "sha512-kftcoawOeOVUGuGWmMupJt7FGLK1pqOrh02FlJwtImmPGZ2yTWCTx2D+N/g95qD2jCbQ/ntH1goBixhAIIxL+g==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.38", + "@babel/code-frame": "7.0.0-beta.39", "chalk": "2.3.0", "micromatch": "2.3.11", "slash": "1.0.0", @@ -6483,13 +6655,13 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.0.tgz", - "integrity": "sha512-4lMxDCiQYK7qfVi9fKhDf2PpvXXeH/KAmcH6o0Ga7fApi8+lTBxRqGHWZ9B11SsK/pxQKOtsw413utw0M+hUrg==", + "version": "11.6.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", + "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", "dev": true, "requires": { "abab": "1.0.4", - "acorn": "5.3.0", + "acorn": "5.4.1", "acorn-globals": "4.1.0", "array-equal": "1.0.0", "browser-process-hrtime": "0.1.2", @@ -6514,148 +6686,6 @@ "whatwg-url": "6.4.0", "ws": "4.0.0", "xml-name-validator": "3.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "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 - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", - "dev": true - }, - "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.4.1", - "sshpk": "1.13.1" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - }, - "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.1.1" - } - } } }, "jsesc": { @@ -6800,13 +6830,6 @@ "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "junk": { @@ -6914,9 +6937,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash._baseassign": { "version": "3.2.0", @@ -7167,7 +7190,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -7301,9 +7324,9 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { "version": "1.0.0", @@ -7570,6 +7593,21 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -7621,19 +7659,19 @@ "console-browserify": "1.1.0", "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", + "domain-browser": "1.2.0", "events": "1.1.1", "https-browserify": "1.0.0", "os-browserify": "0.3.0", "path-browserify": "0.0.0", "process": "0.11.10", - "punycode": "1.4.1", + "punycode": "1.3.2", "querystring-es3": "0.2.1", "readable-stream": "2.3.3", "stream-browserify": "2.0.1", "stream-http": "2.8.0", "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "timers-browserify": "2.0.6", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", @@ -7659,6 +7697,11 @@ "which": "1.3.0" } }, + "nodemailer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.4.2.tgz", + "integrity": "sha512-sstDxbCSPHDXrWRQhH++khr3yVU0CGvH2dCtAHOPQQ0lRR7xwq2txItEXckMpX481B/cN+0akER2bfExh7Gu/Q==" + }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", @@ -7693,7 +7736,7 @@ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "requires": { "prepend-http": "2.0.0", - "query-string": "5.0.1", + "query-string": "5.1.0", "sort-keys": "2.0.0" } }, @@ -7719,7 +7762,7 @@ "npm-package-arg": "5.1.2", "npmlog": "4.1.2", "once": "1.4.0", - "request": "2.79.0", + "request": "2.83.0", "retry": "0.10.1", "semver": "5.5.0", "slide": "1.1.6", @@ -7952,7 +7995,7 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { "minimist": "0.0.10", - "wordwrap": "0.0.3" + "wordwrap": "0.0.2" }, "dependencies": { "minimist": { @@ -8492,9 +8535,9 @@ } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" }, "q": { "version": "1.5.1", @@ -8507,9 +8550,9 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "query-string": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.0.1.tgz", - "integrity": "sha512-aM+MkQClojlNiKkO09tiN2Fv8jM/L7GWIjG2liWeKljlOdOPNWr+bW3KQ+w5V/uKprpezC7fAsAMsJtJ+2rLKA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", + "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", "requires": { "decode-uri-component": "0.2.0", "object-assign": "4.1.1", @@ -8699,7 +8742,7 @@ "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz", "integrity": "sha1-RABCa8+oDKpnJMd1VpUxUgn6Swc=", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "react-stripe-checkout": { @@ -8976,46 +9019,38 @@ } }, "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "requires": { - "aws-sign2": "0.6.0", + "aws-sign2": "0.7.0", "aws4": "1.6.0", - "caseless": "0.11.0", + "caseless": "0.12.0", "combined-stream": "1.0.5", "extend": "3.0.1", "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", "mime-types": "2.1.17", "oauth-sign": "0.8.2", - "qs": "6.3.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", "stringstream": "0.0.5", "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3", + "tunnel-agent": "0.6.0", "uuid": "3.1.0" }, "dependencies": { - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" } } }, @@ -9025,7 +9060,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "request-promise-native": { @@ -9261,7 +9296,7 @@ "fs-extra": "4.0.3", "git-head": "1.20.1", "github": "12.1.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "nerf-dart": "1.0.0", "nopt": "4.0.1", "normalize-package-data": "2.4.0", @@ -9540,11 +9575,11 @@ } }, "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "2.16.3" + "hoek": "4.2.0" } }, "sort-keys": { @@ -9685,13 +9720,6 @@ "getpass": "0.1.7", "jsbn": "0.1.1", "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "ssri": { @@ -9897,17 +9925,18 @@ } }, "styled-components": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.0.2.tgz", - "integrity": "sha1-281m7oTURO5DMqf3QCfopnUZFZM=", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.1.6.tgz", + "integrity": "sha1-nEQxRvqCxmWan2TdSTvyICSANC4=", "requires": { "buffer": "5.0.8", - "css-to-react-native": "2.0.4", + "css-to-react-native": "2.1.1", "fbjs": "0.8.16", "hoist-non-react-statics": "1.2.0", "is-plain-object": "2.0.4", "prop-types": "15.6.0", - "stylis": "3.4.5", + "stylis": "3.4.8", + "stylis-rule-sheet": "0.0.7", "supports-color": "3.2.3" }, "dependencies": { @@ -9972,13 +10001,18 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "stylis": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.4.5.tgz", + "integrity": "sha512-xxfO3FlxEKcNL1gTX4Tb/tyDLOlUcWCQopceIoQe7sBsX81Na83PNba7DFqMqgb9Rn1VjHkSAWdS9uhL/NVo+Q==" } } }, "stylis": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.4.5.tgz", - "integrity": "sha512-xxfO3FlxEKcNL1gTX4Tb/tyDLOlUcWCQopceIoQe7sBsX81Na83PNba7DFqMqgb9Rn1VjHkSAWdS9uhL/NVo+Q==" + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.4.8.tgz", + "integrity": "sha512-RVhA1z8dOpHP3hr5B//LrGQzh9sz6Merg4GuOJQu8ZxHP9GmR+cDE6LHkL6l76ASY8pfnsWa1ycjZKjSN2NvLA==" }, "stylis-rule-sheet": { "version": "0.0.7", @@ -10011,9 +10045,9 @@ } }, "symbol-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz", - "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { "version": "3.2.2", @@ -10190,9 +10224,9 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", "requires": { "setimmediate": "1.0.5" } @@ -10209,9 +10243,9 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -10335,6 +10369,13 @@ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "requires": { "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } } }, "tr46": { @@ -10399,9 +10440,12 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } }, "tweetnacl": { "version": "0.14.5", @@ -10467,11 +10511,6 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -10599,13 +10638,6 @@ "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=" - } } }, "url-join": { @@ -10772,13 +10804,6 @@ "assert-plus": "1.0.0", "core-util-is": "1.0.2", "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "vm-browserify": { @@ -10865,14 +10890,6 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "requires": { - "lodash": "4.17.4" - } - }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", @@ -10977,7 +10994,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", "requires": { - "acorn": "5.3.0", + "acorn": "5.4.1", "acorn-dynamic-import": "2.0.2", "ajv": "5.5.2", "ajv-keywords": "2.1.1", @@ -11001,14 +11018,6 @@ "yargs": "8.0.2" }, "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "requires": { - "lodash": "4.17.4" - } - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -11257,9 +11266,9 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, "wrap-ansi": { "version": "2.1.0", @@ -11326,8 +11335,8 @@ "requires": { "chalk": "1.1.3", "debug": "2.6.9", - "filesize": "3.5.11", - "lodash": "4.17.4", + "filesize": "3.6.0", + "lodash": "4.17.5", "mkdirp": "0.5.1", "moment": "2.20.1" }, @@ -11485,9 +11494,9 @@ } }, "zen-observable": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.6.1.tgz", - "integrity": "sha512-DKjFTL7siVLIUMZOFZ0alqMEdTsXPUxoCZzrvB2tdWEVN/6606Qh1nCfSTCAOZMrtcPzzFI3BXmwBKLAew52NA==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.7.1.tgz", + "integrity": "sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg==" } } } diff --git a/frontend/package.json b/frontend/package.json index 7cd5e70..53e5f51 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,7 +18,7 @@ "apollo-client": "^2.2.0", "apollo-link": "^1.0.7", "apollo-link-http": "^1.3.2", - "apollo-link-state": "^0.3.1", + "apollo-link-state": "^0.4.0", "auth0-lock": "^11.1.0", "babel-plugin-styled-components": "^1.5.0", "downshift": "^1.25.0", @@ -32,6 +32,7 @@ "micro-dev": "^2.2.0", "next": "^4.2.3", "next-routes": "^1.2.0", + "nodemailer": "^4.4.2", "nprogress": "^0.2.0", "prop-types": "^15.6.0", "react": "^16.2.0", diff --git a/frontend/pages/admin/update.js b/frontend/pages/admin/update.js index ab98add..e9cd745 100644 --- a/frontend/pages/admin/update.js +++ b/frontend/pages/admin/update.js @@ -1,15 +1,16 @@ import { Component } from 'react'; import withData from '../../lib/withData'; import UpdateItem from '../../components/UpdateItem'; +import Page from '../../components/Page'; class Home extends Component { render() { return ( - <div> + <Page> <p>Update You Item!</p> <UpdateItem id={this.props.url.query.id} /> - </div> - ) + </Page> + ); } } diff --git a/frontend/pages/signup.js b/frontend/pages/signup.js index f36b16f..1ea3794 100644 --- a/frontend/pages/signup.js +++ b/frontend/pages/signup.js @@ -1,21 +1,17 @@ import { Component } from 'react'; import withData from '../lib/withData'; -import Items from '../components/Items'; -import CreateItem from '../components/CreateItem'; import Signup from '../components/Signup'; -import LoginAuth0 from '../components/LoginAuth0'; +import Signin from '../components/Signin'; import Page from '../components/Page'; +import RequestReset from '../components/RequestReset'; -class SignUpPage extends Component { - render() { - return ( - <Page> - <p>I'm the signup url!</p> - <LoginAuth0></LoginAuth0> - <Signup /> - </Page> - ) - } -} +const SignUpPage = () => ( + <Page> + <p>I'm the Sign Up url!</p> + <Signup /> + {/* <Signin /> */} + <RequestReset /> + </Page> +); export default withData(SignUpPage); diff --git a/frontend/queries/index.js b/frontend/queries/index.js index fb7445e..ea02c8b 100644 --- a/frontend/queries/index.js +++ b/frontend/queries/index.js @@ -1,5 +1,5 @@ -import gql from "graphql-tag"; -import { itemDetails } from "./fragments"; +import gql from 'graphql-tag'; +import { itemDetails } from './fragments'; export const CREATE_ITEM_MUTATION = gql` ${itemDetails} @@ -10,28 +10,40 @@ export const CREATE_ITEM_MUTATION = gql` } `; -export const CREATE_USER_MUTATION = gql` - mutation CreateUserMutation( - $email: String! - $name: String! - $idToken: String! - ) { - createUser( - email: $email - name: $name - authProvider: { auth0: { idToken: $idToken } } - ) { - id - email - name - cart { +export const SIGNUP_MUTATION = gql` + mutation signup($email: String!, $name: String!, $password: String!) { + signup(email: $email, name: $name, password: $password) { + token + user { id - title + email + name } } } `; +export const SIGNIN_MUTATION = gql` + mutation signup($email: String!, $password: String!) { + signin(email: $email, password: $password) { + token + user { + id + email + name + } + } + } +`; + +export const REQUEST_RESET_MUTATION = gql` + mutation requestReset($email: String!) { + requestReset(email: $email) { + id + } + } +`; + export const CREATE_ORDER_MUTATION = gql` mutation CreateOrderMutation($token: String!, $userId: ID!, $itemId: ID!) { createOrder(token: $token, userId: $userId, itemId: $itemId) { @@ -76,7 +88,7 @@ export const ALL_ITEMS_QUERY = gql` export const SINGLE_ITEM_QUERY = gql` ${itemDetails} query FindItem($id: ID!) { - Item(id: $id) { + items(where: { id: $id }) { ...itemDetails } } @@ -98,8 +110,8 @@ export const SEARCH_ITEMS_QUERY = gql` } `; -export const DELETE_ITEM_MUTATION = gql` - mutation DelteItem($id: ID!) { +export const REMOVE_ITEM_MUTATION = gql` + mutation RemoveItem($id: ID!) { deleteItem(id: $id) { id title @@ -115,14 +127,14 @@ export const UPDATE_LINK_MUTATION = gql` $title: String! $description: String! $price: Int! - $fullPrice: Int! + # $fullPrice: Int! ) { updateItem( id: $id description: $description title: $title price: $price - fullPrice: $fullPrice + # fullPrice: $fullPrice ) { ...itemDetails } @@ -131,19 +143,10 @@ export const UPDATE_LINK_MUTATION = gql` export const CURRENT_USER_QUERY = gql` query userQuery { - user { + me { id - name email - cart { - id - price - title - image { - id - secret - } - } + name } } `; |
