From 71dd246745352bb05fa8624ec3d156b48b6b0365 Mon Sep 17 00:00:00 2001 From: Sigve Date: Fri, 2 Dec 2016 18:11:03 -0500 Subject: [PATCH 01/61] Remove account from market state, use SagaShared getAccount to fetch accounts #437 --- app/components/pages/Market.jsx | 21 ++++++++++++--------- app/redux/AuthSaga.js | 12 ++++-------- app/redux/GlobalReducer.js | 1 - app/redux/MarketReducer.js | 14 ++------------ app/redux/MarketSaga.js | 12 ++---------- 5 files changed, 20 insertions(+), 40 deletions(-) diff --git a/app/components/pages/Market.jsx b/app/components/pages/Market.jsx index 0cf12ee685..075e8ee19e 100644 --- a/app/components/pages/Market.jsx +++ b/app/components/pages/Market.jsx @@ -530,15 +530,18 @@ class Market extends React.Component { const DEFAULT_EXPIRE = 0xFFFFFFFF//Math.floor((Date.now() / 1000) + (60 * 60 * 24)) // 24 hours module.exports = { path: 'market', - component: connect(state => ({ - orderbook: state.market.get('orderbook'), - open_orders: process.env.BROWSER ? state.market.get('open_orders') : [], - ticker: state.market.get('ticker'), - account: state.market.get('account'), - history: state.market.get('history'), - user: state.user.get('current') ? state.user.get('current').get('username') : null, - feed: state.global.get('feed_price').toJS() - }), + component: connect(state => { + const username = state.user.get('current') ? state.user.get('current').get('username') : null; + return { + orderbook: state.market.get('orderbook'), + open_orders: process.env.BROWSER ? state.market.get('open_orders') : [], + ticker: state.market.get('ticker'), + account: state.global.getIn(['accounts', username]), + history: state.market.get('history'), + user: username, + feed: state.global.get('feed_price').toJS() + } + }, dispatch => ({ notify: (message) => { dispatch({type: 'ADD_NOTIFICATION', payload: diff --git a/app/redux/AuthSaga.js b/app/redux/AuthSaga.js index 42629c166c..ab33ec30ac 100644 --- a/app/redux/AuthSaga.js +++ b/app/redux/AuthSaga.js @@ -4,7 +4,7 @@ import Apis from 'shared/api_client/ApiInstances' import {Set, Map, fromJS, List} from 'immutable' import {PrivateKey} from 'shared/ecc' import user from 'app/redux/User' -import g from 'app/redux/GlobalReducer' +import {getAccount} from 'app/redux/SagaShared' // operations that require only posting authority const postingOps = Set(`vote, comment, delete_comment, custom_json`.trim().split(/,\s*/)) @@ -113,13 +113,9 @@ export function* findSigningKey({opType, username, password}) { const private_keys = currentUsername === username ? currentUser.get('private_keys') : Map() - let account = yield select(state => state.global.getIn(['accounts', username])) - if (!account) { - [account] = yield call(Apis.db_api, 'get_accounts', [username]) - if (!account) throw new Error('Account not found') - account = fromJS(account) - yield put(g.actions.receiveAccount({account})) - } + const account = yield call(getAccount, username); + if (!account) throw new Error('Account not found') + for (const authType of authTypes) { let private_key if (password) { diff --git a/app/redux/GlobalReducer.js b/app/redux/GlobalReducer.js index 869fd955a6..cc3f8bf181 100644 --- a/app/redux/GlobalReducer.js +++ b/app/redux/GlobalReducer.js @@ -23,7 +23,6 @@ export default createModule({ { action: 'RECEIVE_STATE', reducer: (state, action) => { - // console.log('RECEIVE_STATE', action, state.toJS()); let payload = fromJS(action.payload) if(payload.has('content')) { const content = payload.get('content').withMutations(c => { diff --git a/app/redux/MarketReducer.js b/app/redux/MarketReducer.js index 5da03afe72..719acd8109 100644 --- a/app/redux/MarketReducer.js +++ b/app/redux/MarketReducer.js @@ -1,10 +1,6 @@ -import {Map, Set, List, fromJS, Iterable} from 'immutable'; +import {Map} from 'immutable'; import createModule from 'redux-modules'; -import {PropTypes} from 'react'; -import {emptyContent} from 'app/redux/EmptyState'; -import constants from './constants'; -const {string, object, bool, array, oneOf, oneOfType, func, any} = PropTypes export default createModule({ name: 'market', @@ -39,12 +35,6 @@ export default createModule({ reducer: (state, action) => { return state.set('history', [...action.payload, ...state.get('history')]); } - }, - { - action: 'RECEIVE_ACCOUNT', - reducer: (state, action) => { - return state.set('account', action.payload.account); - } - }, + } ] }); diff --git a/app/redux/MarketSaga.js b/app/redux/MarketSaga.js index 2abc14e9e5..0824743ddf 100644 --- a/app/redux/MarketSaga.js +++ b/app/redux/MarketSaga.js @@ -2,9 +2,7 @@ import {takeLatest} from 'redux-saga'; import {call, put} from 'redux-saga/effects'; import Apis from 'shared/api_client/ApiInstances'; import MarketReducer from './MarketReducer'; -import g from 'app/redux/GlobalReducer' -// import constants from './constants'; -import {fromJS} from 'immutable' +import {getAccount} from './SagaShared'; export const marketWatches = [watchLocationChange, watchUserLogin, watchMarketUpdate]; @@ -68,13 +66,7 @@ export function* fetchOpenOrders(set_user_action) { const db_api = Apis.instance().db_api; const state = yield call([db_api, db_api.exec], 'get_open_orders', [username]); yield put(MarketReducer.actions.receiveOpenOrders(state)); - - let [account] = yield call(Apis.db_api, 'get_accounts', [username]) - if(account) { - account = fromJS(account) - yield put(MarketReducer.actions.receiveAccount({ account })) - yield put(g.actions.receiveAccount({ account })) // TODO: move out of MarketSaga. See notes in #741 - } + yield call(getAccount, username, true); } catch (error) { console.error('~~ Saga fetchOpenOrders error ~~>', error); yield put({type: 'global/STEEM_API_ERROR', error: error.message}); From 9d18d1719e242b6c8fc52f2c0e5b12504af81469 Mon Sep 17 00:00:00 2001 From: valzav Date: Fri, 2 Dec 2016 18:53:20 -0500 Subject: [PATCH 02/61] extend cookies expiration to 60 days; fix one more /page_view issue --- server/api/general.js | 2 ++ server/server.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/server/api/general.js b/server/api/general.js index e8b15b572c..3693af7c1a 100644 --- a/server/api/general.js +++ b/server/api/general.js @@ -284,6 +284,8 @@ export default function useGeneralApi(app) { } else { yield models.Page.create(escAttrs({permlink: page, views}), {logging: false}); } + } else { + if (page_model) views = page_model.views; } this.body = JSON.stringify({views}); if (mixpanel) { diff --git a/server/server.js b/server/server.js index 800e7ed7d4..ef59a2e232 100644 --- a/server/server.js +++ b/server/server.js @@ -33,7 +33,7 @@ const env = process.env.NODE_ENV || 'development'; const cacheOpts = {maxAge: 86400000, gzip: true}; app.keys = [config.session_key]; -app.use(session({maxAge: 1000 * 3600 * 24 * 7}, app)); +app.use(session({maxAge: 1000 * 3600 * 24 * 60}, app)); csrf(app); app.use(mount(grant)); app.use(flash({key: 'flash'})); From 6b90a28f41704b46c6582915d068755c1d050109 Mon Sep 17 00:00:00 2001 From: originate Date: Sat, 3 Dec 2016 21:48:52 -0500 Subject: [PATCH 03/61] Add overlay scroll for potential firefox bug not able to scroll a post --- app/components/cards/PostsList.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/cards/PostsList.scss b/app/components/cards/PostsList.scss index f918224614..3268504195 100644 --- a/app/components/cards/PostsList.scss +++ b/app/components/cards/PostsList.scss @@ -5,7 +5,7 @@ width: 100%; height: 100%; z-index: 300; - + overflow: scroll; background-color: $white; // padding: 0 .9rem; } From c99b45e5e57706f3a9b4463e06177434223f1ecb Mon Sep 17 00:00:00 2001 From: James Calfee Date: Fri, 2 Dec 2016 11:05:59 -0600 Subject: [PATCH 04/61] Separate follow types for data comming in from the API. #745 --- app/redux/FollowSaga.js | 57 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/app/redux/FollowSaga.js b/app/redux/FollowSaga.js index 88ef6b1f2a..311ed16515 100644 --- a/app/redux/FollowSaga.js +++ b/app/redux/FollowSaga.js @@ -1,41 +1,62 @@ -import {fromJS, Map} from 'immutable' +import {fromJS, Map, Set, List} from 'immutable' import {call, put} from 'redux-saga/effects'; import {Apis} from 'shared/api_client'; -import {List} from 'immutable' + +/** + This loadFollows both 'blog' and 'ignore' +*/ // Test limit with 2 (not 1, infinate looping) export function* loadFollows(method, account, type, start = '', limit = 100) { const res = fromJS(yield Apis.follow(method, account, start, type, limit)) // console.log('res.toJS()', res.toJS()) + let cnt = 0 - let lastFollowing = null - const key = method === "get_following" ? "following" : "follower"; + let lastAccountName = null + const accountNameKey = method === "get_following" ? "following" : "follower"; + yield put({type: 'global/UPDATE', payload: { key: ['follow', method, account], notSet: Map(), updater: m => { - m = m.update('result', Map(), m2 => { - res.forEach(value => { - cnt++ - let what = value.get('what') - if(typeof what === 'string') what = new List([what]) // TODO: after shared-db upgrade, this line can be removed - const following = lastFollowing = value.get(key) - m2 = m2.set(following, what) + m = m.asMutable() + res.forEach(value => { + cnt++ + + let whatList = value.get('what') + if(typeof whatList === 'string') + whatList = new List([whatList]) // TODO: after shared-db upgrade, this line can be removed + + const accountName = lastAccountName = value.get(accountNameKey) + whatList.forEach(what => { + //currently this is always true: what === type + m.update(what + '_loading', Set(), s => s.add(accountName)) }) - return m2 }) - const count = m.get('result') ? m.get('result').filter(a => { - return a.get(0) === "blog"; - }).size : 0; - return m.merge({count, [type]: {loading: true, error: null}}) + m.merge({[type]: {loading: true, error: null}}) + return m.asImmutable() } }}) + if(cnt === limit) { - yield call(loadFollows, method, account, type, lastFollowing) + // This is paging each block of up to limit results + yield call(loadFollows, method, account, type, lastAccountName) } else { + // This condition happens only once at the very end of the list. + // Every account has a different followers and following list for: blog, ignore yield put({type: 'global/UPDATE', payload: { key: ['follow', method, account], - updater: m => m.merge({[type]: {loading: false, error: null}}) + updater: m => { + m = m.asMutable() + const result = m.get(type + '_loading') + m.delete(type + '_loading') + m.merge({ + [type + '_count']: result.size, + [type + '_result']: result, + [type]: {loading: false, error: null}, + }) + return m.asImmutable() + } }}) } } From 1122e1ae86f0c49d220fb9c9640fec3a4dfa2093 Mon Sep 17 00:00:00 2001 From: James Calfee Date: Fri, 2 Dec 2016 18:17:13 -0600 Subject: [PATCH 05/61] Refactor follow data-structure. #745 --- app/components/cards/Comment.jsx | 7 ++- app/components/cards/PostsList.jsx | 12 ++-- app/components/cards/UserListRow.jsx | 2 +- app/components/elements/Follow.jsx | 82 +++++++++++++++------------- app/components/elements/UserList.jsx | 13 ++--- app/components/pages/Post.jsx | 19 ++++--- app/components/pages/UserProfile.jsx | 70 ++++++++++-------------- app/redux/FollowSaga.js | 15 +++-- app/redux/TransactionSaga.js | 48 ++++++++++++++-- 9 files changed, 153 insertions(+), 115 deletions(-) diff --git a/app/components/cards/Comment.jsx b/app/components/cards/Comment.jsx index 7985c77313..1b752e1430 100644 --- a/app/components/cards/Comment.jsx +++ b/app/components/cards/Comment.jsx @@ -368,8 +368,11 @@ const Comment = connect( } const current = state.user.get('current') const username = current ? current.get('username') : null - const key = ['follow', 'get_following', username, 'result', c.get('author')] - const ignore = username ? state.global.getIn(key, List()).contains('ignore') : false + + const key = ['follow', 'get_following', username, 'ignore_result', c.get('author')] + const ignore = username ? state.global.hasIn(key) : false + if(ignore) console.log(username, 'ignored comment by', c.get('author'), '\t', comment_link) + return { ...ownProps, comment_link, diff --git a/app/components/cards/PostsList.jsx b/app/components/cards/PostsList.jsx index f47a956a45..b806ed55f1 100644 --- a/app/components/cards/PostsList.jsx +++ b/app/components/cards/PostsList.jsx @@ -157,7 +157,7 @@ class PostsList extends React.Component { render() { const {posts, showSpam, loading, category, content, - follow, account} = this.props; + ignore_result, account} = this.props; const {thumbSize, showPost} = this.state const postsInfo = []; posts.forEach(item => { @@ -166,13 +166,13 @@ class PostsList extends React.Component { console.error('PostsList --> Missing cont key', item) return } - const key = [cont.get('author')] - const ignore = follow ? follow.getIn(key, List()).contains('ignore') : false + const ignore = ignore_result.has(cont.get('author')) + if(ignore) console.log('ignored post by', content.get('author'), '\t', item) + const {hide, netVoteSign, authorRepLog10} = cont.get('stats').toJS() if(!(ignore || hide) || showSpam) // rephide postsInfo.push({item, ignore, netVoteSign, authorRepLog10}) }); - const renderSummary = items => items.map(item =>
  • ({ fetchState: (pathname) => { diff --git a/app/components/cards/UserListRow.jsx b/app/components/cards/UserListRow.jsx index d37b81510c..afd0dbc05f 100644 --- a/app/components/cards/UserListRow.jsx +++ b/app/components/cards/UserListRow.jsx @@ -8,7 +8,7 @@ class UserListRow extends React.Component { return( {loggedIn && - + } {user} diff --git a/app/components/elements/Follow.jsx b/app/components/elements/Follow.jsx index 7aa1ebf37a..3a980bf97c 100644 --- a/app/components/elements/Follow.jsx +++ b/app/components/elements/Follow.jsx @@ -7,67 +7,72 @@ import g from 'app/redux/GlobalReducer'; import {Set, Map} from 'immutable' import { translate } from 'app/Translator'; -const {string, object, bool, func, any} = PropTypes -const followTypes = ['blog', 'posts'] -const followTypeSet = Set(followTypes) +const {string, bool, any} = PropTypes export default class Follow extends React.Component { static propTypes = { following: string, follower: string, // OPTIONAL default to current user - what: string, // see followTypes showFollow: bool, showMute: bool, fat: bool, children: any, - - // redux - follow: func, - loading: bool, - existingFollows: object, } + static defaultProps = { showFollow: true, showMute: true, fat: false, } + constructor(props) { super() this.initEvents(props) this.shouldComponentUpdate = shouldComponentUpdate(this, 'Follow') } + componentWillUpdate(nextProps) { this.initEvents(nextProps) } + initEvents(props) { - const {follow, follower, following, existingFollows, what} = props - this.follow = () => follow(follower, following, existingFollows.remove('ignore').add(what)) - this.unfollow = () => follow(follower, following, existingFollows.remove(what)) - this.ignore = () => follow(follower, following, Set(['ignore'])) - this.unignore = () => follow(follower, following, Set()) + const {updateFollow, follower, following} = props + this.follow = () => {updateFollow(follower, following, 'blog')} + this.unfollow = () => {updateFollow(follower, following)} + this.ignore = () => {updateFollow(follower, following, 'ignore')} + this.unignore = () => {updateFollow(follower, following)} } render() { - const {follower, following, what, showFollow, showMute, fat, children} = this.props // html - const {existingFollows, loading} = this.props // redux + const {loading} = this.props if(loading) return {translate('loading')}… - if(!follower || !following || !what) return - if(follower === following) return // don't follow self if(loading !== false) { // must know what the user is already following before any update can happen return } - if(!followTypeSet.has(what)) { - console.log('Unknown follow type:', what) - return - } + + const {follower, following} = this.props // html + if(!follower || !following) return + if(follower === following) return // Can't follow or ignore self + + const {followingWhat} = this.props // redux + const {showFollow, showMute, fat, children} = this.props // html + const cnActive = 'button' + (fat ? '' : ' slim') const cnInactive = cnActive + ' hollow secondary' return - {showFollow && !existingFollows.has(what) && } - {showFollow && existingFollows.has(what) && } - {showMute && !existingFollows.has('ignore') && } - {showMute && existingFollows.has('ignore') && } + {showFollow && followingWhat !== 'blog' && + } + + {showFollow && followingWhat === 'blog' && + } + + {showMute && followingWhat !== 'ignore' && + } + + {showMute && followingWhat === 'ignore' && + } + {children &&   {children}} } @@ -75,31 +80,34 @@ export default class Follow extends React.Component { const emptyMap = Map() const emptySet = Set() + module.exports = connect( (state, ownProps) => { let {follower} = ownProps - const {following} = ownProps if(!follower) { const current_user = state.user.get('current') follower = current_user ? current_user.get('username') : null } + + const {following} = ownProps const f = state.global.getIn(['follow', 'get_following', follower], emptyMap) - const loading = f.getIn(['blog', 'loading'], false) || f.getIn(['ignore', 'loading'], false) - const existingFollows = Set(f.getIn(['result', following], emptySet))// Convert List to Set + const loading = f.get('blog_loading', false) || f.get('ignore_loading', false) + const followingWhat = + f.get('blog_result', emptySet).contains(following) ? 'blog' : + f.get('ignore_result', emptySet).contains(following) ? 'ignore' : + null + return { follower, - existingFollows, + following, + followingWhat, loading, }; }, dispatch => ({ - follow: (follower, following, what) => { - const json = ['follow', {follower, following, what: what.toJS()}] - dispatch(g.actions.update({ - key: ['follow', 'get_following', follower, 'result', following], - notSet: Set(), - updater: () => what - })) + updateFollow: (follower, following, action) => { + const what = action ? [action] : [] + const json = ['follow', {follower, following, what}] dispatch(transaction.actions.broadcastOperation({ type: 'custom_json', operation: { diff --git a/app/components/elements/UserList.jsx b/app/components/elements/UserList.jsx index 3afac52902..747f1c36cc 100644 --- a/app/components/elements/UserList.jsx +++ b/app/components/elements/UserList.jsx @@ -25,15 +25,14 @@ class UserList extends React.Component { render() { const {state: {historyIndex}} = this const account = this.props.account - const users = this.props.users.get('result') + const users = this.props.users const title = this.props.title - let user_list = users.map((item, index) => { - if(item.get(0) === "blog") { - return - } - return null; - }).filter(el => !!el).toArray(); + let idx = 0 + let user_list = users.map(user => + + ) + user_list = user_list.toArray(); let currentIndex = -1; const usersLength = users.size; diff --git a/app/components/pages/Post.jsx b/app/components/pages/Post.jsx index 4604649505..2f6d43ef8c 100644 --- a/app/components/pages/Post.jsx +++ b/app/components/pages/Post.jsx @@ -8,7 +8,7 @@ import {sortComments} from 'app/components/cards/Comment'; // import { Link } from 'react-router'; import FoundationDropdownMenu from 'app/components/elements/FoundationDropdownMenu'; import SvgImage from 'app/components/elements/SvgImage'; -import {List} from 'immutable' +import {Set} from 'immutable' import { translate } from 'app/Translator'; import { localizedCurrency } from 'app/components/elements/LocalizedCurrency'; import shouldComponentUpdate from 'app/utils/shouldComponentUpdate'; @@ -57,7 +57,7 @@ class Post extends React.Component { render() { const {showSignUp} = this - const {current_user, following, signup_bonus, content} = this.props + const {current_user, ignoring, signup_bonus, content} = this.props const {showNegativeComments, commentHidden, showAnyway} = this.state let post = this.props.post; if (!post) { @@ -96,8 +96,9 @@ class Post extends React.Component { const c = content.get(a); const hide = c.getIn(['stats', 'hide']) let ignore = false - if(following) { - ignore = following.get(c.get('author'), List()).contains('ignore') + if(ignoring) { + ignore = ignoring.has(c.get('author')) + if(ignore) console.log(current_user && current_user.get('username'), 'is ignoring post author', c.get('author'), '\t', a) } return !hide && !ignore } @@ -198,18 +199,20 @@ class Post extends React.Component { } } +const emptySet = Set() + export default connect(state => { const current_user = state.user.get('current') - let following + let ignoring if(current_user) { - const key = ['follow', 'get_following', current_user.get('username'), 'result'] - following = state.global.getIn(key, List()) + const key = ['follow', 'get_following', current_user.get('username'), 'ignore_result'] + ignoring = state.global.getIn(key, emptySet) } return { content: state.global.get('content'), signup_bonus: state.offchain.get('signup_bonus'), current_user, - following, + ignoring, } } )(Post); diff --git a/app/components/pages/UserProfile.jsx b/app/components/pages/UserProfile.jsx index 285b377cbf..36f6d0717c 100644 --- a/app/components/pages/UserProfile.jsx +++ b/app/components/pages/UserProfile.jsx @@ -113,24 +113,10 @@ export default class UserProfile extends React.Component { return
    {translate('unknown_account')}
    } - let followerCount, followingCount; - const followers = follow ? follow.getIn( ['get_followers', accountname] ) : null; - const following = follow ? follow.getIn( ['get_following', accountname] ) : null; - if(followers && followers.has('result') && followers.has('blog')) { - const status_followers = followers.get('blog') - const followers_loaded = status_followers.get('loading') === false && status_followers.get('error') == null - if (followers_loaded) { - followerCount = followers.get('count'); - } - } - - if (following && following.has('result') && following.has('blog')) { - const status_following = following.get('blog') - const following_loaded = status_following.get('loading') === false && status_following.get('error') == null - if (following_loaded) { - followingCount = following.get('count'); - } - } + const followers = this.props.global.getIn(['follow', 'get_followers', accountname]); + const following = this.props.global.getIn(['follow', 'get_following', accountname]); + const followerCount = followers && followers.get('blog_count') + const followingCount = following && following.get('blog_count') const rep = repLog10(account.reputation); @@ -152,46 +138,46 @@ export default class UserProfile extends React.Component { if( section === 'transfers' ) { walletClass = 'active' tab_content =
    - + {isMyAccount &&
    }
    ; } else if( section === 'curation-rewards' ) { rewardsClass = "active"; tab_content = + account={account} + current_user={current_user} + /> } else if( section === 'author-rewards' ) { rewardsClass = "active"; tab_content = + account={account} + current_user={current_user} + /> } else if( section === 'followers' ) { - if (followers && followers.has('result')) { + if (followers && followers.has('blog_result')) { tab_content =
    + title={translate('followers')} + account={account} + users={followers.get('blog_result')} /> {isMyAccount && }
    } } else if( section === 'followed' ) { - if (following && following.has('result')) { + if (following && following.has('blog_result')) { tab_content = + title="Followed" + account={account} + users={following.get('blog_result')} + /> } } else if( section === 'settings' ) { @@ -316,7 +302,7 @@ export default class UserProfile extends React.Component { } } - const wallet_tab_active = section === 'transfers' || section === 'password' || section === 'permissions' ? 'active' : ''; // className={wallet_tab_active} + // const wallet_tab_active = section === 'transfers' || section === 'password' || section === 'permissions' ? 'active' : ''; // className={wallet_tab_active} let rewardsMenu = [ {link: `/@${accountname}/curation-rewards`, label: translate('curation_rewards'), value: translate('curation_rewards')}, @@ -332,7 +318,7 @@ export default class UserProfile extends React.Component {
  • {translate('blog')}
  • {translate('comments')}
  • - {translate('replies')} {isMyAccount && } + {translate('replies')} {isMyAccount && }
  • {/*
  • Feed
  • */}
  • @@ -377,7 +363,7 @@ export default class UserProfile extends React.Component {
    - +
    @@ -402,7 +388,7 @@ export default class UserProfile extends React.Component {

    {location && {location}} {website && {website_label}} - +

    diff --git a/app/redux/FollowSaga.js b/app/redux/FollowSaga.js index 311ed16515..aed0a90a3a 100644 --- a/app/redux/FollowSaga.js +++ b/app/redux/FollowSaga.js @@ -30,10 +30,10 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { const accountName = lastAccountName = value.get(accountNameKey) whatList.forEach(what => { //currently this is always true: what === type - m.update(what + '_loading', Set(), s => s.add(accountName)) + m.update(what + '_inprogress', Set(), s => s.add(accountName)) }) }) - m.merge({[type]: {loading: true, error: null}}) + m.merge({[type + '_loading']: true}) return m.asImmutable() } }}) @@ -48,12 +48,15 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { key: ['follow', method, account], updater: m => { m = m.asMutable() - const result = m.get(type + '_loading') - m.delete(type + '_loading') + + const result = m.get(type + '_inprogress', Set()) + + m.delete(type + '_inprogress') m.merge({ + // Count may be set separately without loading the full xxx_result set [type + '_count']: result.size, - [type + '_result']: result, - [type]: {loading: false, error: null}, + [type + '_result']: result.sort().reverse(), + [type + '_loading']: false, }) return m.asImmutable() } diff --git a/app/redux/TransactionSaga.js b/app/redux/TransactionSaga.js index ef08bfae28..a8ce843486 100644 --- a/app/redux/TransactionSaga.js +++ b/app/redux/TransactionSaga.js @@ -4,7 +4,7 @@ import {Apis} from 'shared/api_client' import {createTransaction, signTransaction} from 'shared/chain/transactions' import {ops} from 'shared/serializer' import {PublicKey, PrivateKey} from 'shared/ecc' -import {fromJS} from 'immutable' +import {fromJS, Set, Map} from 'immutable' import {getAccount} from 'app/redux/SagaShared' import {findSigningKey} from 'app/redux/AuthSaga' import {encode} from 'shared/chain/memo' @@ -41,16 +41,17 @@ const hook = { preBroadcast_comment, preBroadcast_transfer, preBroadcast_vote, - accepted_comment, - accepted_delete_comment, - accepted_vote, + preBroadcast_account_witness_vote, + preBroadcast_custom_json, error_vote, error_custom_json, - preBroadcast_account_witness_vote, + // error_account_update, error_account_witness_vote, + accepted_comment, + accepted_delete_comment, + accepted_vote, accepted_account_update, accepted_withdraw_vesting, - // error_account_update, } function* preBroadcast_transfer({operation}) { @@ -88,6 +89,41 @@ function* preBroadcast_account_witness_vote({operation, username}) { yield put(g.actions.updateAccountWitnessVote({account, witness, approve})) return operation } + +function* preBroadcast_custom_json({operation}) { + const json = JSON.parse(operation.json) + if(operation.id === 'follow') { + try { + if(json[0] === 'follow') { + const {follower, following, what: [action]} = json[1] + yield put(g.actions.update({ + key: ['follow', 'get_following', follower], + notSet: Map(), + updater: m => { + //m = m.asMutable() + if(action == null) { + m = m.update('blog_result', Set(), r => r.delete(following)) + m = m.update('ignore_result', Set(), r => r.delete(following)) + } else if(action === 'blog') { + m = m.update('blog_result', Set(), r => r.add(following)) + m = m.update('ignore_result', Set(), r => r.delete(following)) + } else if(action === 'ignore') { + m = m.update('ignore_result', Set(), r => r.add(following)) + m = m.update('blog_result', Set(), r => r.delete(following)) + } + m = m.set('blog_count', m.get('blog_result', Set()).size) + m = m.set('ignore_count', m.get('ignore_result', Set()).size) + return m//.asImmutable() + } + })) + } + } catch(e) { + console.error('TransactionSaga unrecognized follow custom_json format', operation.json); + } + } + return operation +} + function* error_account_witness_vote({operation: {account, witness, approve}}) { yield put(g.actions.updateAccountWitnessVote({account, witness, approve: !approve})) } From ee7f82580e31590a2187bf2eb62f1889e2b0dade Mon Sep 17 00:00:00 2001 From: James Calfee Date: Mon, 5 Dec 2016 10:55:03 -0600 Subject: [PATCH 06/61] Refactor follow data-structure, remove log messages. #745 --- app/components/cards/Comment.jsx | 2 +- app/components/pages/Post.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/cards/Comment.jsx b/app/components/cards/Comment.jsx index 1b752e1430..e6cd3097c4 100644 --- a/app/components/cards/Comment.jsx +++ b/app/components/cards/Comment.jsx @@ -371,7 +371,7 @@ const Comment = connect( const key = ['follow', 'get_following', username, 'ignore_result', c.get('author')] const ignore = username ? state.global.hasIn(key) : false - if(ignore) console.log(username, 'ignored comment by', c.get('author'), '\t', comment_link) + // if(ignore) console.log(username, 'ignored comment by', c.get('author'), '\t', comment_link) return { ...ownProps, diff --git a/app/components/pages/Post.jsx b/app/components/pages/Post.jsx index 2f6d43ef8c..9edb4db890 100644 --- a/app/components/pages/Post.jsx +++ b/app/components/pages/Post.jsx @@ -98,7 +98,7 @@ class Post extends React.Component { let ignore = false if(ignoring) { ignore = ignoring.has(c.get('author')) - if(ignore) console.log(current_user && current_user.get('username'), 'is ignoring post author', c.get('author'), '\t', a) + // if(ignore) console.log(current_user && current_user.get('username'), 'is ignoring post author', c.get('author'), '\t', a) } return !hide && !ignore } From 5adbc33a4c6c17e9458b1922cc53dbb4b27d75c8 Mon Sep 17 00:00:00 2001 From: James Calfee Date: Mon, 5 Dec 2016 11:46:08 -0600 Subject: [PATCH 07/61] Refactor follow, resolve conflicts. #745 --- app/components/cards/PostsList.jsx | 3 +-- app/components/pages/UserProfile.jsx | 12 ++++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/components/cards/PostsList.jsx b/app/components/cards/PostsList.jsx index b806ed55f1..1840b10523 100644 --- a/app/components/cards/PostsList.jsx +++ b/app/components/cards/PostsList.jsx @@ -6,7 +6,6 @@ import debounce from 'lodash.debounce'; import CloseButton from 'react-foundation-components/lib/global/close-button'; import {findParent} from 'app/utils/DomUtils'; import Icon from 'app/components/elements/Icon'; -import {List} from "immutable"; import shouldComponentUpdate from 'app/utils/shouldComponentUpdate'; function topPosition(domElt) { @@ -166,7 +165,7 @@ class PostsList extends React.Component { console.error('PostsList --> Missing cont key', item) return } - const ignore = ignore_result.has(cont.get('author')) + const ignore = ignore_result && ignore_result.has(cont.get('author')) if(ignore) console.log('ignored post by', content.get('author'), '\t', item) const {hide, netVoteSign, authorRepLog10} = cont.get('stats').toJS() diff --git a/app/components/pages/UserProfile.jsx b/app/components/pages/UserProfile.jsx index 36f6d0717c..1395716e21 100644 --- a/app/components/pages/UserProfile.jsx +++ b/app/components/pages/UserProfile.jsx @@ -45,12 +45,12 @@ export default class UserProfile extends React.Component { const account = np.routeParams.accountname.toLowerCase(); if (follow) { - followersLoading = follow.getIn(['get_followers', account, 'blog', 'loading'], false); - followingLoading = follow.getIn(['get_following', account, 'blog', 'loading'], false); + followersLoading = follow.getIn(['get_followers', account, 'blog_loading'], false); + followingLoading = follow.getIn(['get_following', account, 'blog_loading'], false); } if (np.follow) { - npFollowersLoading = np.follow.getIn(['get_followers', account, 'blog', 'loading'], false); - npFollowingLoading = np.follow.getIn(['get_following', account, 'blog', 'loading'], false); + npFollowersLoading = np.follow.getIn(['get_followers', account, 'blog_loading'], false); + npFollowingLoading = np.follow.getIn(['get_following', account, 'blog_loading'], false); } return ( @@ -113,8 +113,8 @@ export default class UserProfile extends React.Component { return
    {translate('unknown_account')}
    } - const followers = this.props.global.getIn(['follow', 'get_followers', accountname]); - const following = this.props.global.getIn(['follow', 'get_following', accountname]); + const followers = follow && follow.getIn(['get_followers', accountname]); + const following = follow && follow.getIn(['get_following', accountname]); const followerCount = followers && followers.get('blog_count') const followingCount = following && following.get('blog_count') From 4a9b83af47cfb584e7f4aaffc1d691c8b5109fc3 Mon Sep 17 00:00:00 2001 From: James Calfee Date: Mon, 5 Dec 2016 11:54:30 -0600 Subject: [PATCH 08/61] Refactor follow data-structure, remove log messages. #745 --- app/components/cards/PostsList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/cards/PostsList.jsx b/app/components/cards/PostsList.jsx index 1840b10523..2db6eb9194 100644 --- a/app/components/cards/PostsList.jsx +++ b/app/components/cards/PostsList.jsx @@ -166,7 +166,7 @@ class PostsList extends React.Component { return } const ignore = ignore_result && ignore_result.has(cont.get('author')) - if(ignore) console.log('ignored post by', content.get('author'), '\t', item) + // if(ignore) console.log('ignored post by', cont.get('author'), '\t', item) const {hide, netVoteSign, authorRepLog10} = cont.get('stats').toJS() if(!(ignore || hide) || showSpam) // rephide From 770b131b70f1f58d8457bf25a2a4fed69caa92cc Mon Sep 17 00:00:00 2001 From: originate Date: Mon, 5 Dec 2016 16:28:47 -0500 Subject: [PATCH 09/61] Update post footer classes to collapse more natural with foundation --- app/components/cards/PostFull.jsx | 6 ++++-- app/components/elements/ShareMenu.scss | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/components/cards/PostFull.jsx b/app/components/cards/PostFull.jsx index cabaaa4740..2c16745e3e 100644 --- a/app/components/cards/PostFull.jsx +++ b/app/components/cards/PostFull.jsx @@ -262,12 +262,13 @@ class PostFull extends React.Component { {showPromote && } -
    +
    -
    +
    +
    {!readonly && } {!readonly && @@ -284,6 +285,7 @@ class PostFull extends React.Component { +
    diff --git a/app/components/elements/ShareMenu.scss b/app/components/elements/ShareMenu.scss index 31ba48f7eb..21dfe1f88b 100644 --- a/app/components/elements/ShareMenu.scss +++ b/app/components/elements/ShareMenu.scss @@ -9,7 +9,7 @@ margin-left: 0.01em; li { float: left; - padding-left: 5px; + padding-left: 3px; } li > a:hover { color: #ffffff; From abdd52369781c7a85f474a4291e515e3cfd305c9 Mon Sep 17 00:00:00 2001 From: James Calfee Date: Mon, 5 Dec 2016 15:52:00 -0600 Subject: [PATCH 10/61] Refactor follow, moved _inprogress outside of follow tree. #745 --- app/redux/FollowSaga.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/redux/FollowSaga.js b/app/redux/FollowSaga.js index aed0a90a3a..7d425e3ae2 100644 --- a/app/redux/FollowSaga.js +++ b/app/redux/FollowSaga.js @@ -18,6 +18,12 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { yield put({type: 'global/UPDATE', payload: { key: ['follow', method, account], notSet: Map(), + updater: m => m.set(type + '_loading', true), + }}) + + yield put({type: 'global/UPDATE', payload: { + key: ['follow_inprogress', method, account], + notSet: Map(), updater: m => { m = m.asMutable() res.forEach(value => { @@ -30,10 +36,9 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { const accountName = lastAccountName = value.get(accountNameKey) whatList.forEach(what => { //currently this is always true: what === type - m.update(what + '_inprogress', Set(), s => s.add(accountName)) + m.update(what, Set(), s => s.add(accountName)) }) }) - m.merge({[type + '_loading']: true}) return m.asImmutable() } }}) @@ -45,19 +50,18 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { // This condition happens only once at the very end of the list. // Every account has a different followers and following list for: blog, ignore yield put({type: 'global/UPDATE', payload: { - key: ['follow', method, account], + key: [], updater: m => { m = m.asMutable() - const result = m.get(type + '_inprogress', Set()) - - m.delete(type + '_inprogress') - m.merge({ + const result = m.getIn(['follow_inprogress', method, account, type], Set()) + m.deleteIn(['follow_inprogress', method, account, type]) + m.updateIn(['follow', method, account], Map(), mm => mm.merge({ // Count may be set separately without loading the full xxx_result set [type + '_count']: result.size, [type + '_result']: result.sort().reverse(), [type + '_loading']: false, - }) + })) return m.asImmutable() } }}) From f329323d2007eb702d023ac1eca9f9fb6f0df8bb Mon Sep 17 00:00:00 2001 From: James Calfee Date: Mon, 5 Dec 2016 15:55:07 -0600 Subject: [PATCH 11/61] Removed global prop from UserWallet --- app/components/pages/UserProfile.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/pages/UserProfile.jsx b/app/components/pages/UserProfile.jsx index 1395716e21..bcfe7224c8 100644 --- a/app/components/pages/UserProfile.jsx +++ b/app/components/pages/UserProfile.jsx @@ -138,7 +138,7 @@ export default class UserProfile extends React.Component { if( section === 'transfers' ) { walletClass = 'active' tab_content =
    - Date: Mon, 5 Dec 2016 17:13:56 -0500 Subject: [PATCH 12/61] Adjust post footer spacing to gracefully handle longer usernames, collapse better on screen size --- app/components/cards/PostFull.jsx | 36 ++++++++++++-------------- app/components/cards/PostFull.scss | 21 ++++++++------- app/components/elements/ShareMenu.scss | 3 ++- app/components/elements/Voting.scss | 4 +-- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/app/components/cards/PostFull.jsx b/app/components/cards/PostFull.jsx index 2c16745e3e..d26dad1177 100644 --- a/app/components/cards/PostFull.jsx +++ b/app/components/cards/PostFull.jsx @@ -267,25 +267,23 @@ class PostFull extends React.Component {
    -
    -
    - {!readonly && } - {!readonly && - - {showReplyOption && Reply} - {' '}{showEditOption && !showEdit && Edit} - {' '}{showDeleteOption && !showReply && Delete} - } - - - {content.children} - - - - - -
    +
    + {!readonly && } + {!readonly && + + {showReplyOption && Reply} + {' '}{showEditOption && !showEdit && Edit} + {' '}{showDeleteOption && !showReply && Delete} + } + + + {content.children} + + + + +
    diff --git a/app/components/cards/PostFull.scss b/app/components/cards/PostFull.scss index e886823d60..1a5c269893 100644 --- a/app/components/cards/PostFull.scss +++ b/app/components/cards/PostFull.scss @@ -13,8 +13,8 @@ color: $dark-gray; font-weight: 400; border-right: 1px solid $medium-gray; - padding-right: 1rem; - margin-right: 1rem; + padding-right: .6rem; + margin-right: .6rem; > span { white-space: nowrap; } @@ -78,21 +78,21 @@ } .Reblog__button { - padding-right: 1rem; - margin-right: 1rem; + padding-right: .6rem; + margin-right: .6rem; border-right: 1px solid $medium-gray; } } .PostFull__responses { - padding-right: 1rem; + padding-right: .6rem; //margin-right: 1rem; //border-right: 1px solid $medium-gray; } .PostFull__views { - padding-right: 1rem; - margin-right: 1rem; + padding-right: .6rem; + margin-right: .6rem; color: $dark-gray; font-size: 94%; font-weight: 600; @@ -100,8 +100,8 @@ } .PostFull__reply { - padding-right: 1rem; - margin-right: 1rem; + padding-right: .6rem; + margin-right: .6rem; border-right: 1px solid $medium-gray; a {margin: 0 0.15rem;} } @@ -129,4 +129,7 @@ -ms-flex: 0 0 100%; flex: 0 0 100%; } + .PostFull__footer > .right-sub-menu { + text-align: left; + } } diff --git a/app/components/elements/ShareMenu.scss b/app/components/elements/ShareMenu.scss index 21dfe1f88b..e764347c40 100644 --- a/app/components/elements/ShareMenu.scss +++ b/app/components/elements/ShareMenu.scss @@ -1,6 +1,7 @@ .shareMenu { display: inline-block; vertical-align: middle; + height: 2em; } .shareItems { @@ -9,7 +10,7 @@ margin-left: 0.01em; li { float: left; - padding-left: 3px; + padding-left: 4px; } li > a:hover { color: #ffffff; diff --git a/app/components/elements/Voting.scss b/app/components/elements/Voting.scss index c743732f46..c7df724013 100644 --- a/app/components/elements/Voting.scss +++ b/app/components/elements/Voting.scss @@ -123,8 +123,8 @@ .Voting__inner { border-right: 1px solid #cacaca; - padding-right: 1rem; - margin-right: 1rem; + padding-right: .8rem; + margin-right: .6rem; position: relative; .DropdownMenu .Icon.dropdown-arrow { margin-right: -0.5rem From bcd8d359812597d0ed3cd3aa3989c2cfa58a3c43 Mon Sep 17 00:00:00 2001 From: valzav Date: Mon, 5 Dec 2016 17:58:15 -0500 Subject: [PATCH 13/61] track FirstVisit event with mixpanel --- server/api/general.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/server/api/general.js b/server/api/general.js index 3693af7c1a..6baf973465 100644 --- a/server/api/general.js +++ b/server/api/general.js @@ -266,6 +266,10 @@ export default function useGeneralApi(app) { const params = this.request.body; const {csrf, page, ref} = typeof(params) === 'string' ? JSON.parse(params) : params; if (!checkCSRF(this, csrf)) return; + if (page.match(/\/feed$/)) { + this.body = JSON.stringify({views: 0}); + return; + } console.log('-- /page_view -->', this.session.uid, page); const remote_ip = getRemoteIp(this.req); try { @@ -294,13 +298,18 @@ export default function useGeneralApi(app) { const matches = ref.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); referring_domain = matches && matches[1]; } - mixpanel.track('PageView', { + const mp_params = { distinct_id: this.session.uid, Page: page, ip: remote_ip, $referrer: ref, $referring_domain: referring_domain - }); + }; + mixpanel.track('PageView', mp_params); + if (!this.session.mp) { + mixpanel.track('FirstVisit', mp_params); + this.session.mp = 1; + } if (ref) mixpanel.people.set_once(this.session.uid, '$referrer', ref); mixpanel.people.set_once(this.session.uid, 'FirstPage', page); mixpanel.people.increment(this.session.uid, 'PageView', 1); From 418a1a01d6c732b07d5bdbceb79e934a917330d6 Mon Sep 17 00:00:00 2001 From: Sigve Date: Mon, 5 Dec 2016 17:34:24 -0500 Subject: [PATCH 14/61] Move getContent function to SagaShared --- app/redux/SagaShared.js | 10 ++++++++++ app/redux/TransactionSaga.js | 10 +--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/redux/SagaShared.js b/app/redux/SagaShared.js index e6d61e8971..9f512f42a2 100644 --- a/app/redux/SagaShared.js +++ b/app/redux/SagaShared.js @@ -74,3 +74,13 @@ function* showTransactionErrorNotification() { yield put({type: 'transaction/DELETE_ERROR', payload: {key}}); } } + +export function* getContent({author, permlink, resolve, reject}) { + const content = yield call([Apis, Apis.db_api], 'get_content', author, permlink); + yield put(g.actions.receiveContent({content})) + if (resolve && content) { + resolve(content); + } else if (reject && !content) { + reject(); + } +} diff --git a/app/redux/TransactionSaga.js b/app/redux/TransactionSaga.js index ef08bfae28..9476c64e60 100644 --- a/app/redux/TransactionSaga.js +++ b/app/redux/TransactionSaga.js @@ -5,7 +5,7 @@ import {createTransaction, signTransaction} from 'shared/chain/transactions' import {ops} from 'shared/serializer' import {PublicKey, PrivateKey} from 'shared/ecc' import {fromJS} from 'immutable' -import {getAccount} from 'app/redux/SagaShared' +import {getAccount, getContent} from 'app/redux/SagaShared' import {findSigningKey} from 'app/redux/AuthSaga' import {encode} from 'shared/chain/memo' import g from 'app/redux/GlobalReducer' @@ -437,14 +437,6 @@ function slug(text) { // .toLowerCase() } -function* getContent({author, permlink}) { - const content = yield call([Apis, Apis.db_api], 'get_content', author, permlink) - yield put(g.actions.receiveContent({content})) - // const update = {content: {}} - // update.content[author + '/' + permlink] = content - // yield put(g.actions.receiveState(update)) -} - function* recoverAccount({payload: {account_to_recover, old_password, new_password, onError, onSuccess}}) { const [account] = yield call([Apis, Apis.db_api], 'get_accounts', [account_to_recover]) if(!account) { From 259ccf79ae117afcfe76889b1ede7a7f2736b7f3 Mon Sep 17 00:00:00 2001 From: Sigve Date: Mon, 5 Dec 2016 18:41:02 -0500 Subject: [PATCH 15/61] Watch for GET_CONTENT action in FetchDataSaga --- app/redux/FetchDataSaga.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/redux/FetchDataSaga.js b/app/redux/FetchDataSaga.js index 31d8b1bcd7..e6b291c0d8 100644 --- a/app/redux/FetchDataSaga.js +++ b/app/redux/FetchDataSaga.js @@ -1,17 +1,26 @@ import {takeLatest, takeEvery} from 'redux-saga'; import {call, put, select, fork} from 'redux-saga/effects'; import {loadFollows} from 'app/redux/FollowSaga'; +import {getContent} from 'app/redux/SagaShared'; import Apis from 'shared/api_client/ApiInstances'; import GlobalReducer from './GlobalReducer'; import constants from './constants'; import {fromJS, Map} from 'immutable' -export const fetchDataWatches = [watchLocationChange, watchDataRequests, watchApiRequests, watchFetchJsonRequests, watchFetchState]; +export const fetchDataWatches = [watchLocationChange, watchDataRequests, watchApiRequests, watchFetchJsonRequests, watchFetchState, watchGetContent]; export function* watchDataRequests() { yield* takeLatest('REQUEST_DATA', fetchData); } +export function* watchGetContent() { + yield* takeEvery('GET_CONTENT', getContentCaller); +} + +export function* getContentCaller(action) { + yield getContent(action.payload); +} + export function* fetchState(location_change_action) { const {pathname} = location_change_action.payload; const m = pathname.match(/^\/@([a-z0-9\.-]+)/) From 77af178760f3cdf41b24e9efead672f55bad5b0a Mon Sep 17 00:00:00 2001 From: valzav Date: Mon, 5 Dec 2016 18:44:47 -0500 Subject: [PATCH 16/61] make it not crash on links like /recent/story etc --- app/components/pages/PostsIndex.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/pages/PostsIndex.jsx b/app/components/pages/PostsIndex.jsx index a9d7ad31fe..90235bc3ef 100644 --- a/app/components/pages/PostsIndex.jsx +++ b/app/components/pages/PostsIndex.jsx @@ -87,7 +87,7 @@ class PostsIndex extends React.Component { } } else { posts = this.getPosts(order, category); - if (posts !== null && posts.size === 0) { + if (posts && posts.size === 0) { emptyText =
    {`No ` + topics_order + (category ? ` #` + category : '') + ` posts found`}
    ; } } From 5a50b3f476a39d6b94a4a421e94ecd545662c23b Mon Sep 17 00:00:00 2001 From: Sigve Date: Mon, 5 Dec 2016 18:47:16 -0500 Subject: [PATCH 17/61] Add a route with redirect for /@author/permlink, #608 --- app/ResolveRoute.js | 17 ++++- app/RootRoute.js | 2 + app/components/pages/PostPageNoCategory.jsx | 72 +++++++++++++++++++++ shared/UniversalRender.jsx | 8 +++ 4 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 app/components/pages/PostPageNoCategory.jsx diff --git a/app/ResolveRoute.js b/app/ResolveRoute.js index 365141039c..1dc89d98ba 100644 --- a/app/ResolveRoute.js +++ b/app/ResolveRoute.js @@ -1,3 +1,10 @@ +export const routeRegex = { + PostsIndex: /^\/(@[\w\.\d-]+)\/feed\/?$/, + UserProfile1: /^\/(@[\w\.\d-]+)\/?$/, + UserProfile2: /^\/(@[\w\.\d-]+)\/(blog|posts|comments|recommended|transfers|curation-rewards|author-rewards|permissions|created|recent-replies|feed|password|followed|followers|settings)\/?$/, + PostNoCategory: /^\/(@[\w\.\d-]+)\/([\w\d-]+)/ +} + export default function resolveRoute(path) { if (path === '/') { @@ -54,16 +61,20 @@ export default function resolveRoute(path) if (path === '/submit.html') { return {page: 'SubmitPost'}; } - let match = path.match(/^\/(@[\w\.\d-]+)\/feed\/?$/); + let match = path.match(routeRegex.PostsIndex); if (match) { return {page: 'PostsIndex', params: ['home', match[1]]}; } - match = path.match(/^\/(@[\w\.\d-]+)\/?$/) || + match = path.match(routeRegex.UserProfile1) || // @user/"posts" is deprecated in favor of "comments" as of oct-2016 (#443) - path.match(/^\/(@[\w\.\d-]+)\/(blog|posts|comments|recommended|transfers|curation-rewards|author-rewards|permissions|created|recent-replies|feed|password|followed|followers|settings)\/?$/); + path.match(routeRegex.UserProfile2); if (match) { return {page: 'UserProfile', params: match.slice(1)}; } + match = path.match(routeRegex.PostNoCategory); + if (match) { + return {page: 'PostNoCategory', params: match.slice(1)}; + } match = path.match(/^\/(\@[\w\d-]+)\/([\w\d-]+)\/?$/) || path.match(/^\/([\w\d\-\/]+)\/(\@[\w\d\.-]+)\/([\w\d-]+)\/?$/) || path.match(/^\/([\w\d\-\/]+)\/(\@[\w\d\.-]+)\/([\w\d-]+)\/?\?sort=(\w+)$/); diff --git a/app/RootRoute.js b/app/RootRoute.js index 5141dd516d..b4cd44bc47 100644 --- a/app/RootRoute.js +++ b/app/RootRoute.js @@ -88,6 +88,8 @@ export default { //require.ensure([], (require) => { cb(null, [require('app/components/pages/PostPage')]); //}); + } else if (route.page === 'PostNoCategory') { + cb(null, [require('app/components/pages/PostPageNoCategory')]); } else if (route.page === 'PostsIndex') { //require.ensure([], (require) => { //cb(null, [require('app/components/pages/PostsIndex')]); diff --git a/app/components/pages/PostPageNoCategory.jsx b/app/components/pages/PostPageNoCategory.jsx new file mode 100644 index 0000000000..ab8e4866bc --- /dev/null +++ b/app/components/pages/PostPageNoCategory.jsx @@ -0,0 +1,72 @@ +import React from 'react'; +import LoadingIndicator from 'app/components/elements/LoadingIndicator'; +import SvgImage from 'app/components/elements/SvgImage'; +import { browserHistory } from 'react-router'; +import {connect} from 'react-redux'; + +class PostWrapper extends React.Component { + + constructor() { + super(); + + this.state = { + loading: true + } + } + + componentWillMount() { + const route_params = this.props.routeParams; + const post = route_params.username + '/' + route_params.slug; + const dis = this.props.content.get(post); + if (!dis) { + this.props.getContent({author: route_params.username, permlink: route_params.slug}) + .then(content => { + if (content) { + browserHistory.replace(`/${content.category}/@${post}`) + } + }).catch(() => { + this.setState({loading: false}); + }); + } else if (dis.get("id") === "0.0.0") { // non-existing post + this.setState({loading: false}); + } else { + browserHistory.replace(`/${dis.get('category')}/@${post}`) + } + } + + shouldComponentUpdate(np, ns) { + return ( + ns.loading !== this.state.loading + ) + } + + render() { + return ( +
    + {this.state.loading ? +
    : +
    + +
    } +
    + ); + } +} + +const StoreWrapped = connect( + state => { + return { + content: state.global.get('content') + }; + }, + dispatch => ({ + getContent: (payload) => (new Promise((resolve, reject) => { + dispatch({type: 'GET_CONTENT', payload: {...payload, resolve, reject}}) + })) + }) +)(PostWrapper); + +module.exports = { + path: '/@:username/:slug', + component: StoreWrapped +}; diff --git a/shared/UniversalRender.jsx b/shared/UniversalRender.jsx index b03afe0d27..4e37a6d0f3 100644 --- a/shared/UniversalRender.jsx +++ b/shared/UniversalRender.jsx @@ -29,6 +29,7 @@ import {serverApiRecordEvent} from 'app/utils/ServerApiClient'; import Translator from 'app/Translator'; import Tarantool from 'db/tarantool'; import {notificationsArrayToMap} from 'app/utils/Notifications'; +import {routeRegex} from "app/ResolveRoute"; const sagaMiddleware = createSagaMiddleware( ...userWatches, // keep first to remove keys early when a page change happens @@ -143,6 +144,13 @@ async function universalRender({ location, initial_state, offchain }) { onchain = await Apis.instance().db_api.exec('get_state', [url]); + if (!url.match(routeRegex.PostsIndex) && !url.match(routeRegex.UserProfile1) && !url.match(routeRegex.UserProfile2) && url.match(routeRegex.PostNoCategory)) { + const params = url.substr(2, url.length - 1).split("/"); + const content = await Apis.instance().db_api.exec('get_content', [params[0], params[1]]); + if (content) { + onchain.content[url.substr(2, url.length - 1)] = content; + } + } // Calculate signup bonus const fee = parseFloat($STM_Config.registrar_fee.split(' ')[0]), {base, quote} = onchain.feed_price, From b23025f68d81604b29b57ac598b29594ded90c0b Mon Sep 17 00:00:00 2001 From: Sigve Date: Mon, 5 Dec 2016 18:48:17 -0500 Subject: [PATCH 18/61] Update meta title handling for /@author/permlink route #608 --- app/components/modules/Header.jsx | 2 +- app/utils/ExtractMeta.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/components/modules/Header.jsx b/app/components/modules/Header.jsx index bbf2a30c6d..1287b73283 100644 --- a/app/components/modules/Header.jsx +++ b/app/components/modules/Header.jsx @@ -143,7 +143,7 @@ class Header extends React.Component { } - if (process.env.BROWSER && route.page !== 'Post') document.title = page_title + ' — Steemit'; + if (process.env.BROWSER && (route.page !== 'Post' && route.page !== 'PostNoCategory')) document.title = page_title + ' — Steemit'; const logo_link = route.params && route.params.length > 1 && this.last_sort_order ? '/' + this.last_sort_order : (current_account_name ? `/@${current_account_name}/feed` : '/'); let topic_link = topic ? {topic} : null; diff --git a/app/utils/ExtractMeta.js b/app/utils/ExtractMeta.js index c612158d89..cf3652d041 100644 --- a/app/utils/ExtractMeta.js +++ b/app/utils/ExtractMeta.js @@ -23,9 +23,8 @@ export default function extractMeta(chain_data, rp) { if (rp.username && rp.slug) { // post const post = `${rp.username}/${rp.slug}`; const content = chain_data.content[post]; - if (content) { + if (content && content.id !== '0.0.0') { // API currently returns 'false' data with id 0.0.0 for posts that do not exist const d = extractContent(objAccessor, content, false); - const url = 'https://steemit.com' + d.link; const title = d.title + ' — Steemit'; const desc = d.desc + " by " + d.author; @@ -54,7 +53,6 @@ export default function extractMeta(chain_data, rp) { metas.push({name: 'twitter:title', content: title}); metas.push({name: 'twitter:description', content: desc}); metas.push({name: 'twitter:image', content: image || 'https://steemit.com/images/steemit-twshare.png'}); - } else { addSiteMeta(metas); } From 7c7df9d77cc1b14601221c21206732c22334a205 Mon Sep 17 00:00:00 2001 From: Sigve Date: Mon, 5 Dec 2016 18:48:51 -0500 Subject: [PATCH 19/61] Make curation rewards link to the full post instead of author only #769 --- app/components/cards/TransferHistoryRow.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/components/cards/TransferHistoryRow.jsx b/app/components/cards/TransferHistoryRow.jsx index 50b2013fa0..601dd424e6 100644 --- a/app/components/cards/TransferHistoryRow.jsx +++ b/app/components/cards/TransferHistoryRow.jsx @@ -76,8 +76,7 @@ class TransferHistoryRow extends React.Component { description_start += "Start power down of " + data.vesting_shares; } else if( type === 'curation_reward' ) { description_start += `${curation_reward} STEEM POWER for `; - other_account = data.comment_author; - description_end = `/${data.comment_permlink}`; + other_account = data.comment_author + "/" + data.comment_permlink; } else if (type === 'author_reward') { let steem_payout = "" if(data.steem_payout !== '0.000 STEEM') steem_payout = ", " + data.steem_payout; From 27eff6f4bad87f684a8914e2e4cb18f832c5bfed Mon Sep 17 00:00:00 2001 From: Sigve Date: Mon, 5 Dec 2016 18:54:15 -0500 Subject: [PATCH 20/61] Only use browserHistory in the client #608 --- app/components/pages/PostPageNoCategory.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/pages/PostPageNoCategory.jsx b/app/components/pages/PostPageNoCategory.jsx index ab8e4866bc..84b478e2aa 100644 --- a/app/components/pages/PostPageNoCategory.jsx +++ b/app/components/pages/PostPageNoCategory.jsx @@ -30,7 +30,7 @@ class PostWrapper extends React.Component { } else if (dis.get("id") === "0.0.0") { // non-existing post this.setState({loading: false}); } else { - browserHistory.replace(`/${dis.get('category')}/@${post}`) + if (browserHistory) browserHistory.replace(`/${dis.get('category')}/@${post}`) } } From e1da27fc733c4ab1d55eb53cf1c9f5da81d2dbef Mon Sep 17 00:00:00 2001 From: Sigve Kvalsvik Date: Tue, 6 Dec 2016 11:47:22 -0500 Subject: [PATCH 21/61] 783 meta links (#785) * Add 'http://' to website url if missing #783 * Remove console log * Move website url http check inside NormalizeProfile --- app/utils/NormalizeProfile.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/utils/NormalizeProfile.js b/app/utils/NormalizeProfile.js index 79a9210b27..a6a3e7a5ee 100644 --- a/app/utils/NormalizeProfile.js +++ b/app/utils/NormalizeProfile.js @@ -33,6 +33,9 @@ export default function normalizeProfile(account) { location = truncate(location, 30) if(website && website.length > 100) website = null; + if (website && website.indexOf("http") === -1) { + website = 'http://' + website; + } if(profile_image && !/^https?:\/\//.test(profile_image)) profile_image = null; return { From ceeb89dec21904414c575b8f5a4cef1ff288c2fc Mon Sep 17 00:00:00 2001 From: valzav Date: Tue, 6 Dec 2016 13:03:20 -0500 Subject: [PATCH 22/61] remove high security keys when post overlay is shown --- app/components/cards/PostsList.jsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/components/cards/PostsList.jsx b/app/components/cards/PostsList.jsx index f47a956a45..22db4a263f 100644 --- a/app/components/cards/PostsList.jsx +++ b/app/components/cards/PostsList.jsx @@ -151,6 +151,7 @@ class PostsList extends React.Component { onPostClick(post, url) { this.post_url = url; this.props.fetchState(url); + this.props.removeHighSecurityKeys(); this.setState({showPost: post, prevTitle: window.document.title}); window.history.pushState({}, '', url); } @@ -225,6 +226,9 @@ export default connect( dispatch => ({ fetchState: (pathname) => { dispatch({type: 'FETCH_STATE', payload: {pathname}}) + }, + removeHighSecurityKeys: () => { + dispatch({type: 'user/REMOVE_HIGH_SECURITY_KEYS'}) } }) )(PostsList) From 55832d4ca1f48fbb891cc83196a25fe6fde5f942 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 13:45:51 -0500 Subject: [PATCH 23/61] enforce display names not starting with @ (#780) * enforce display names not starting with @ * more validation for website field --- app/components/elements/Author.scss | 2 ++ app/components/modules/Settings.jsx | 8 ++++---- app/utils/NormalizeProfile.js | 8 ++++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/components/elements/Author.scss b/app/components/elements/Author.scss index f4fcbe0eac..e935ed426c 100644 --- a/app/components/elements/Author.scss +++ b/app/components/elements/Author.scss @@ -23,6 +23,8 @@ } .Author__bio { + clear: both; font-size: 90%; + padding-top: 5px; } } diff --git a/app/components/modules/Settings.jsx b/app/components/modules/Settings.jsx index 10fdc830de..9eb037a772 100644 --- a/app/components/modules/Settings.jsx +++ b/app/components/modules/Settings.jsx @@ -30,10 +30,10 @@ class Settings extends React.Component { initialValues: props.profile, validation: values => ({ profile_image: values.profile_image && !/^https?:\/\//.test(values.profile_image) ? 'Invalid URL' : null, - name: values.name && values.name.length > 20 ? 'Name is too long' : null, + name: values.name && values.name.length > 20 ? 'Name is too long' : values.name && /^\s*@/.test(values.name) ? 'Name must not begin with @' : null, about: values.about && values.about.length > 160 ? 'About is too long' : null, location: values.location && values.location.length > 30 ? 'Location is too long' : null, - website: values.website && values.website.length > 100 ? 'Website URL is too long' : null, + website: values.website && values.website.length > 100 ? 'Website URL is too long' : values.website && !/^https?:\/\//.test(values.website) ? 'Invalid URL' : null, }) }) this.handleSubmitForm = @@ -168,9 +168,9 @@ class Settings extends React.Component { -
    {website.touched && website.error}
    +
    {website.blur && website.touched && website.error}

    {state.loading &&
    } diff --git a/app/utils/NormalizeProfile.js b/app/utils/NormalizeProfile.js index a6a3e7a5ee..c7c414ab7c 100644 --- a/app/utils/NormalizeProfile.js +++ b/app/utils/NormalizeProfile.js @@ -1,6 +1,9 @@ function truncate(str, len) { - if(str && str.length > len) { - return str.substring(0, len - 1) + '...' + if(str) { + str = str.trim() + if(str.length > len) { + str = str.substring(0, len - 1) + '...' + } } return str } @@ -32,6 +35,7 @@ export default function normalizeProfile(account) { about = truncate(about, 160) location = truncate(location, 30) + if(/^@/.test(name)) name = null; if(website && website.length > 100) website = null; if (website && website.indexOf("http") === -1) { website = 'http://' + website; From ebf5fda6b16aab57d1f5e5fc890c186dff57f6c9 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 13:49:23 -0500 Subject: [PATCH 24/61] show 'since date' for view counts on older posts. resolves #760 (#779) * show 'since date' for view counts on older posts. resolves #760 * ternary op for clarity --- app/components/cards/PostFull.jsx | 3 ++- app/components/elements/PageViewsCounter.jsx | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/components/cards/PostFull.jsx b/app/components/cards/PostFull.jsx index cabaaa4740..a0665cb76d 100644 --- a/app/components/cards/PostFull.jsx +++ b/app/components/cards/PostFull.jsx @@ -243,6 +243,7 @@ class PostFull extends React.Component { const showReplyOption = post_content.get('depth') < 6 const showEditOption = username === author const authorRepLog10 = repLog10(content.author_reputation) + const isPreViewCount = Date.parse(post_content.get('created')) < 1480723200000 // check if post was created before view-count tracking began (2016-12-03) return (
    @@ -281,7 +282,7 @@ class PostFull extends React.Component { -
    diff --git a/app/components/elements/PageViewsCounter.jsx b/app/components/elements/PageViewsCounter.jsx index ff3dbbd9be..23704e419d 100644 --- a/app/components/elements/PageViewsCounter.jsx +++ b/app/components/elements/PageViewsCounter.jsx @@ -41,7 +41,8 @@ export default class PageViewsCounter extends React.Component { render() { const views = this.state.views; if (this.props.hidden || !views) return null; - return + const suffix = this.props.sinceDate ? ' since ' + this.props.sinceDate : '' + return {views} ; } From 779dbe9052b3fbd8046af8a3f5e12fe19b542521 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 13:52:16 -0500 Subject: [PATCH 25/61] update econ rules copy (#793) * change SP vesting period wording, close #790 * update conversion delays --- app/help/en/faq.md | 6 +++--- app/locales/en.js | 8 ++++---- app/locales/es.js | 6 +++--- app/locales/es_AR.js | 4 ++-- app/locales/fr.js | 2 +- app/locales/it.js | 2 +- app/locales/jp.js | 2 +- app/locales/ru.js | 8 ++++---- app/utils/Tips.js | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/help/en/faq.md b/app/help/en/faq.md index b74ae1fcf7..62fa712501 100644 --- a/app/help/en/faq.md +++ b/app/help/en/faq.md @@ -75,13 +75,13 @@ By analogy, Steem is a game system for content, where the rewards people earn ar **Steem** - Steem is the most liquid form of currency in the platform. Steem can be converted into Steem Power, Steem Dollars, or traded. -**Steem Power** - Steem Power is a measurement of how much influence a user can wield via Steemit. The more Steem Power a user holds, the more they may influence the value of the content on the network. It is important to note when a user decides to “Power Down” Steem Power, they will receive equal distributions of the Steem Power as Steem over 104 weeks. +**Steem Power** - Steem Power is a measurement of how much influence a user can wield via Steemit. The more Steem Power a user holds, the more they may influence the value of the content on the network. It is important to note when a user decides to “Power Down” Steem Power, they will receive equal distributions of the Steem Power as Steem over 13 weeks. **Steem Dollars** - Steem Dollars are a blockchain and market powered token designed to be pegged to $1 USD. Steem Dollars may be turned into STEEM before they can be “Powered Up” into Steem Power. Steem Dollars may also be used to buy things in marketplaces, such as Steemit.com and PeerHub.com. ## What is Powering Down and Powering Up? -**Powering Down** - If you have Steem Power, you can begin to Power Down to obtain Steem. The system will transfer 1/104 of your Steem Power, to Steem each week for two years (104 weeks). +**Powering Down** - If you have Steem Power, you can begin to Power Down to obtain Steem. The system will transfer 1/13 of your Steem Power, to Steem each week for three months (13 weeks). **Powering Up** - If you wish to gain more influence in the Steem network, you must increase your Steem Power. Powering Up is the process of instantaneously turning your Steem into Steem Power. @@ -115,7 +115,7 @@ http://steemtools.com/ ## Are my Steem and Steem Dollar tokens insured in the event of a hack or if someone takes over my account? -No, it is not. If your money is in Steem Power, however, it is impossible for a hacker to take out more than 1/104 per week. +No, it is not. If your money is in Steem Power, however, it is impossible for a hacker to take out more than 1/13 per week. ## How do I set my recovery account? diff --git a/app/locales/en.js b/app/locales/en.js index 0c4b4d3576..9a6ae252c5 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -207,12 +207,12 @@ const en = { i_understand_dont_show_again: "I understand, don't show me again", ok: 'Ok', convert_to_LIQUID_TOKEN: 'Convert to ' + LIQUID_TOKEN, - DEBT_TOKEN_will_be_unavailable: 'This action will take place one week from now and can not be canceled. These ' + DEBT_TOKEN + ' will immediatly become unavailable', + DEBT_TOKEN_will_be_unavailable: 'This action will take place 3.5 days from now and can not be canceled. These ' + DEBT_TOKEN + ' will immediatly become unavailable', amount: 'Amount', convert: 'Convert', invalid_amount: 'Invalid amount', insufficent_balance: 'Insufficient balance', - in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'In one week, convert {amount} ' + DEBT_TOKEN + 's into ' + LIQUID_TOKEN, + in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'In 3.5 days, convert {amount} ' + DEBT_TOKEN + 's into ' + LIQUID_TOKEN, order_placed: 'Order placed', // ex.: "Order placed: Sell {someamount_to_sell} for atleast {min_to_receive}" follow: 'Follow', unfollow: 'Unfollow', @@ -393,7 +393,7 @@ const en = { view_the_direct_parent: 'View the direct parent', you_are_viewing_single_comments_thread_from: 'You are viewing a single comment\'s thread from', view_the_full_context: 'View the full context', - this_is_a_price_feed_conversion: 'This is a price feed conversion. The one week day delay is necessary to prevent abuse from gaming the price feed average', + this_is_a_price_feed_conversion: 'This is a price feed conversion. The 3.5 day delay is necessary to prevent abuse from gaming the price feed average', your_existing_DEBT_TOKEN_are_liquid_and_transferable: 'Your existing ' + DEBT_TOKEN + ' are liquid and transferable. Instead you may wish to trade ' + DEBT_TOKEN + ' directly in this site under {link} or transfer to an external market.', buy_or_sell: 'Buy or Sell', trending_30_day: 'trending (30 day)', @@ -483,7 +483,7 @@ const en = { influence_tokens_which_earn_more_power_by_holding_long_term: 'Influence tokens which earn more power by holding long term.', the_more_you_hold_the_more_you_influence_post_rewards: 'The more you hold the more you influence post rewards and earn for accurate voting.', the_estimated_value_is_based_on_a_7_day_average_value_of_LIQUID_TOKEN_in_currency: 'The estimated value is based on a 7 day average value of ' + LIQUID_TOKEN + ' in US Dollars.', - VESTING_TOKEN_is_non_transferrable_and_will_require_2_years_and_104_payments_to_convert_back_to_LIQUID_TOKEN: VESTING_TOKEN + ' is non-transferrable and will require 2 years and 104 payments to convert back to ' + LIQUID_TOKEN + '.', + VESTING_TOKEN_is_non_transferrable_and_requires_convert_back_to_LIQUID_TOKEN: VESTING_TOKEN + ' is non-transferrable and requires 3 months (13 payments) to convert back to ' + LIQUID_TOKEN + '.', converted_VESTING_TOKEN_can_be_sent_to_yourself_but_can_not_transfer_again: 'Converted ' + VESTING_TOKEN + ' can be sent to yourself or someone else but can not transfer again without converting back to ' + LIQUID_TOKEN + '.', profile: 'Profile', send_to_account: "Send to account", diff --git a/app/locales/es.js b/app/locales/es.js index 1b27144143..c4d9237259 100644 --- a/app/locales/es.js +++ b/app/locales/es.js @@ -188,13 +188,13 @@ const es = { i_understand_dont_show_again: "I understand, don't show me again", ok: 'Ok', convert_to_steem: 'Convertir a Steem', - steem_dollars_will_be_unavailable: 'This action will take place one week from now and can not be canceled. These Steem Dollars will immediatly become unavailable', + steem_dollars_will_be_unavailable: 'This action will take place 3.5 days from now and can not be canceled. These Steem Dollars will immediatly become unavailable', amount: 'Cantidad', steem_dollars: 'STEEM DOLLARS', convert: 'Convertir', invalid_amount: 'Invalid amount', insufficent_balance: 'Balance insuficiente', - in_week_convert_steem_dollars_to_steem: 'In one week, convert {amount} STEEM DOLLARS into STEEM', + in_week_convert_steem_dollars_to_steem: 'In 3.5 days, convert {amount} STEEM DOLLARS into STEEM', order_placed: 'Order placed', // ex.: "Order placed: Sell {someamount_to_sell} for atleast {min_to_receive}" follow: 'Seguir', unfollow: 'No seguir', @@ -377,7 +377,7 @@ const es = { view_the_direct_parent: 'Vista directa del padre', you_are_viewing_single_comments_thread_from: 'You are viewing a single comment's thread from', view_the_full_context: 'View the full context', - this_is_a_price_feed_conversion: 'This is a price feed conversion. The one week day delay is necessary to prevent abuse from gaming the price feed average', + this_is_a_price_feed_conversion: 'This is a price feed conversion. The 3.5 day delay is necessary to prevent abuse from gaming the price feed average', your_existing_SD_are_liquid_and_transferable: 'Your existing Steem Dollars are liquid and transferable. Instead you may wish to trade Steem Dollars directly in this site under {link} or transfer to an external market.', buy_or_sell: 'Buy or Sells', trending_30_day: 'trending (30 day)', diff --git a/app/locales/es_AR.js b/app/locales/es_AR.js index 123588e179..6eb2ff5d62 100644 --- a/app/locales/es_AR.js +++ b/app/locales/es_AR.js @@ -188,7 +188,7 @@ const es_AR = { i_understand_dont_show_again: "I understand, don't show me again", ok: 'Ok', convert_to_steem: 'Convertir a Steem', - steem_dollars_will_be_unavailable: 'This action will take place one week from now and can not be canceled. These Steem Dollars will immediatly become unavailable', + steem_dollars_will_be_unavailable: 'This action will take place 3.5 days from now and can not be canceled. These Steem Dollars will immediatly become unavailable', amount: 'Cantidad', steem_dollars: 'STEEM DOLLARS', convert: 'Convertir', @@ -377,7 +377,7 @@ const es_AR = { view_the_direct_parent: 'Vista directa del padre', you_are_viewing_single_comments_thread_from: 'Estás viendo un comentario individual de', view_the_full_context: 'Ver todo el contexto', - this_is_a_price_feed_conversion: 'This is a price feed conversion. The one week day delay is necessary to prevent abuse from gaming the price feed average', + this_is_a_price_feed_conversion: 'This is a price feed conversion. The 3.5 day delay is necessary to prevent abuse from gaming the price feed average', your_existing_SD_are_liquid_and_transferable: 'Your existing Steem Dollars are liquid and transferable. Instead you may wish to trade Steem Dollars directly in this site under {link} or transfer to an external market.', buy_or_sell: 'Comprar o vender', trending_30_day: 'Popular (30 dias)', diff --git a/app/locales/fr.js b/app/locales/fr.js index e9d0a3e4c8..0a68118bb0 100644 --- a/app/locales/fr.js +++ b/app/locales/fr.js @@ -377,7 +377,7 @@ const fr = { view_the_direct_parent: 'View the direct parent', you_are_viewing_single_comments_thread_from: 'You are viewing a single comment's thread from', view_the_full_context: 'View the full context', - this_is_a_price_feed_conversion: 'This is a price feed conversion. The one week day delay is necessary to prevent abuse from gaming the price feed average', + this_is_a_price_feed_conversion: 'This is a price feed conversion. The 3.5 day delay is necessary to prevent abuse from gaming the price feed average', your_existing_SD_are_liquid_and_transferable: 'Your existing Steem Dollars are liquid and transferable. Instead you may wish to trade Steem Dollars directly in this site under {link} or transfer to an external market.', buy_or_sell: 'Buy or Sells', trending_30_day: 'trending (30 day)', diff --git a/app/locales/it.js b/app/locales/it.js index 678468e95b..ede08c9b69 100644 --- a/app/locales/it.js +++ b/app/locales/it.js @@ -377,7 +377,7 @@ const it = { view_the_direct_parent: 'Visualizza cartella principale', you_are_viewing_single_comments_thread_from: 'You are viewing a single comment's thread from', view_the_full_context: 'Visualizza tutto il contesto', - this_is_a_price_feed_conversion: 'This is a price feed conversion. The one week day delay is necessary to prevent abuse from gaming the price feed average', + this_is_a_price_feed_conversion: 'This is a price feed conversion. The 3.5 day delay is necessary to prevent abuse from gaming the price feed average', your_existing_SD_are_liquid_and_transferable: 'I tuoi Steem Dollars esistenti sono liquidi and trasferibili. Instead you may wish to trade Steem Dollars directly in this site under {link} or transfer to an external market.', buy_or_sell: 'Compra or Vendi', trending_30_day: 'trending (30 day)', diff --git a/app/locales/jp.js b/app/locales/jp.js index e12247f370..85d39988e7 100644 --- a/app/locales/jp.js +++ b/app/locales/jp.js @@ -377,7 +377,7 @@ const jp = { view_the_direct_parent: 'View the direct parent', you_are_viewing_single_comments_thread_from: 'You are viewing a single comment's thread from', view_the_full_context: 'View the full context', - this_is_a_price_feed_conversion: 'This is a price feed conversion. The one week day delay is necessary to prevent abuse from gaming the price feed average', + this_is_a_price_feed_conversion: 'This is a price feed conversion. The 3.5 day delay is necessary to prevent abuse from gaming the price feed average', your_existing_SD_are_liquid_and_transferable: 'Your existing Steem Dollars are liquid and transferable. Instead you may wish to trade Steem Dollars directly in this site under {link} or transfer to an external market.', buy_or_sell: '買い/売り', trending_30_day: '30日間のトレンド', diff --git a/app/locales/ru.js b/app/locales/ru.js index b2c70e0d87..6be6ed0a08 100644 --- a/app/locales/ru.js +++ b/app/locales/ru.js @@ -211,12 +211,12 @@ const ru = { i_understand_dont_show_again: "Понимаю, больше не показывать", ok: 'Ок', // Лучше использовать "хорошо" или "ладно"? convert_to_VESTING_TOKEN: 'Перевести в ' + VESTING_TOKEN, - DEBT_TOKEN_will_be_unavailable: 'Эта операция будет проходить через неделю от настоящего момента и ее нельзя отменить. Эти ' + DEBT_TOKEN + ' мгновенно станут недоступны', + DEBT_TOKEN_will_be_unavailable: 'Эта операция будет проходить 3,5 дней от настоящего момента и ее нельзя отменить. Эти ' + DEBT_TOKEN + ' мгновенно станут недоступны', amount: 'Количество', convert: 'Конвертировать', invalid_amount: 'Неверное количество', insufficent_balance: 'Недостаточный баланс', - in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'За неделю перевести {amount} ' + DEBT_TOKEN + ' в ' + LIQUID_TOKEN, + in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'В 3,5 дня перевести {amount} ' + DEBT_TOKEN + ' в ' + LIQUID_TOKEN, order_placed: 'Заказ размещен', // ex.: "Order placed: Sell {someamount_to_sell} for atleast {min_to_receive}" follow: 'Подписаться', unfollow: 'Отписаться', @@ -403,7 +403,7 @@ const ru = { view_the_direct_parent: 'Просмотр прямого родителя', you_are_viewing_single_comments_thread_from: 'Вы читаете одну нить комментариев от', view_the_full_context: 'Показать полный контекст', - this_is_a_price_feed_conversion: 'Это котировка цены. Неделя отсрочки необходима чтобы предотвратить злоупотребление от игры на средней ценовой катировке.', + this_is_a_price_feed_conversion: 'Это котировка цены. Отсрочка 3,5 день необходима чтобы предотвратить злоупотребление от игры на средней ценовой катировке.', your_existing_DEBT_TOKEN_are_liquid_and_transferable: 'Ваши существующие ' + DEBT_TOKEN + ' ликвидны и перемещаемы. Возможно, вы хотите торговать ' + DEBT_TOKEN + ' напрямую на этом сайте в разделе {link} или перевести на внешний рынок.', buy_or_sell: 'Купить или Продать', trending_30_day: 'популярное (30 дней)', @@ -494,7 +494,7 @@ const ru = { influence_tokens_which_earn_more_power_by_holding_long_term: 'Неперемещаемые цифровые токены, их количество увеличивается при долгосрочном хранении.', the_more_you_hold_the_more_you_influence_post_rewards: 'Чем их больше, тем сильней вы влияете на вознаграждения за пост и тем больше зарабатываете за голосование.', the_estimated_value_is_based_on_a_7_day_average_value_of_LIQUID_TOKEN_in_currency: 'Оценочная стоимость рассчитывается из 7-ми дневной средней стоимости ' + LIQUID_TOKEN + '.', - VESTING_TOKEN_is_non_transferrable_and_will_require_2_years_and_104_payments_to_convert_back_to_LIQUID_TOKEN: VESTING_TOKEN + ' нельзя передавать и потребуется 2 года и 104 выплаты чтобы перевести обратно в ' + LIQUID_TOKEN + '.', + VESTING_TOKEN_is_non_transferrable_and_requires_convert_back_to_LIQUID_TOKEN: VESTING_TOKEN + ' нельзя передавать и потребуется 3 месяца и 13 выплаты чтобы перевести обратно в ' + LIQUID_TOKEN + '.', // TODO converted_VESTING_TOKEN_can_be_sent_to_yourself_but_can_not_transfer_again: 'Конвертированная ' + VESTING_TOKEN + ' может быть отправлена себе или кому-то еще, но не может быть передана вновь без конвертирования назад в ' + LIQUID_TOKEN + '.', profile: 'Профиль', diff --git a/app/utils/Tips.js b/app/utils/Tips.js index 5dd0feac75..339ef8b311 100644 --- a/app/utils/Tips.js +++ b/app/utils/Tips.js @@ -14,5 +14,5 @@ export const steemTip = translate('tradeable_tokens_that_may_be_transferred_anyw export const powerTip = 'Influence tokens which give you more control over post payouts and allow you to earn on curation rewards.' //export const powerTip = translate('influence_tokens_which_earn_more_power_by_holding_long_term') + ' ' + translate('the_more_you_hold_the_more_you_influence_post_rewards') //TODO: this text is outdated export const valueTip = translate('the_estimated_value_is_based_on_a_7_day_average_value_of_LIQUID_TOKEN_in_currency') -export const powerTip2 = translate('VESTING_TOKEN_is_non_transferrable_and_will_require_2_years_and_104_payments_to_convert_back_to_LIQUID_TOKEN') +export const powerTip2 = translate('VESTING_TOKEN_is_non_transferrable_and_requires_convert_back_to_LIQUID_TOKEN') export const powerTip3 = translate('converted_VESTING_TOKEN_can_be_sent_to_yourself_but_can_not_transfer_again') From 620c877211389b3a807d6e73bae7e3cae436e699 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 13:55:01 -0500 Subject: [PATCH 26/61] Disable blocktrades (#789) * disable blocktrades dialog from wallet * fix wallet submenu spacing * remove Buy Steem from App menu --- app/components/App.jsx | 4 ++-- app/components/modules/UserWallet.jsx | 7 ++++--- app/components/modules/UserWallet.scss | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/components/App.jsx b/app/components/App.jsx index 89f0d1fc16..10fdee0aa9 100644 --- a/app/components/App.jsx +++ b/app/components/App.jsx @@ -180,11 +180,11 @@ class App extends React.Component { FAQ
  • -
  • + {/*
  • depositSteem()}> {translate("buy_LIQUID_TOKEN")} -
  • + */}
  • {translate('APP_NAME_app_center')}  diff --git a/app/components/modules/UserWallet.jsx b/app/components/modules/UserWallet.jsx index 6b2ea98395..b84dc81d39 100644 --- a/app/components/modules/UserWallet.jsx +++ b/app/components/modules/UserWallet.jsx @@ -19,6 +19,7 @@ import Tooltip from 'app/components/elements/Tooltip' import { translate } from 'app/Translator'; const assetPrecision = 1000; +const BLOCKTRADES_ENABLED = false; class UserWallet extends React.Component { constructor() { @@ -144,9 +145,9 @@ class UserWallet extends React.Component { { value: 'Power Down', link: '#', onClick: powerDown.bind(this, false) } ] if(isMyAccount) { - steem_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositSteem }) + if(BLOCKTRADES_ENABLED) steem_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositSteem }) steem_menu.push({ value: 'Buy or Sell', link: '/market' }) - power_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositPower }) + if(BLOCKTRADES_ENABLED) power_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositPower }) } if( divesting ) { power_menu.push( { value: 'Cancel Power Down', link:'#', onClick: powerDown.bind(this,true) } ); @@ -191,7 +192,7 @@ class UserWallet extends React.Component { {isMyAccount ? :

    BALANCES


    }
    - {isMyAccount && } + {isMyAccount && BLOCKTRADES_ENABLED && }
    diff --git a/app/components/modules/UserWallet.scss b/app/components/modules/UserWallet.scss index 876a6b639a..f3640cbcf3 100644 --- a/app/components/modules/UserWallet.scss +++ b/app/components/modules/UserWallet.scss @@ -22,6 +22,7 @@ font-weight: bold; } border-bottom: 1px solid $medium-gray; + margin: 0.5rem 0 1rem; } // protect for foundation bug for collapsed state drop-downs From 5fac8be452e9183c4ca3f3c8b69151803e8bad8c Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 13:57:15 -0500 Subject: [PATCH 27/61] downsize yt previews, maxresdefault does not work for all videos. close #761. (#777) --- app/components/elements/YoutubePreview.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/elements/YoutubePreview.jsx b/app/components/elements/YoutubePreview.jsx index 6de7220f91..b51d3ec367 100644 --- a/app/components/elements/YoutubePreview.jsx +++ b/app/components/elements/YoutubePreview.jsx @@ -37,7 +37,7 @@ export default class YoutubePreview extends React.Component { // mqdefault.jpg (medium quality version, 320px × 180px) // hqdefault.jpg (high quality version, 480px × 360px // sddefault.jpg (standard definition version, 640px × 480px) - const thumbnail = width <= 320 ? 'mqdefault.jpg' : width <= 480 ? 'hqdefault.jpg' : 'maxresdefault.jpg' + const thumbnail = width <= 320 ? 'mqdefault.jpg' : width <= 480 ? 'hqdefault.jpg' : '0.jpg' const previewLink = `https://img.youtube.com/vi/${youTubeId}/${thumbnail}` return (
    From 9f7555e4b237dbdbe4e55b17698a7b5cccae2752 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 13:59:18 -0500 Subject: [PATCH 28/61] remove 0.15.0 compat layer (#776) * shared-db cleanup * update tags table * remove account.posts check --- app/components/cards/CategorySelector.jsx | 3 +-- app/components/cards/PostFull.jsx | 3 +-- app/components/elements/Voting.jsx | 8 +++----- app/components/modules/Header.jsx | 4 ++-- app/components/pages/TagsIndex.jsx | 24 +++++++++++------------ app/components/pages/TagsIndex.scss | 11 +++++++++-- app/components/pages/Topics.jsx | 3 +-- app/components/pages/UserProfile.jsx | 4 +--- app/redux/FollowSaga.js | 7 ++----- app/redux/GlobalReducer.js | 4 +--- 10 files changed, 32 insertions(+), 39 deletions(-) diff --git a/app/components/cards/CategorySelector.jsx b/app/components/cards/CategorySelector.jsx index e8e6d30e62..108f4344e9 100644 --- a/app/components/cards/CategorySelector.jsx +++ b/app/components/cards/CategorySelector.jsx @@ -89,8 +89,7 @@ export function validateCategory(category, required = true) { ) } export default connect((state, ownProps) => { - // TODO: use 'tag_idx' after shared-db upgrade - const trending = state.global.getIn(['category_idx', 'trending']) || state.global.getIn(['tag_idx', 'trending']) + const trending = state.global.getIn(['tag_idx', 'trending']) // apply translations // they are used here because default prop can't acces intl property const placeholder = translate('tag_your_story'); diff --git a/app/components/cards/PostFull.jsx b/app/components/cards/PostFull.jsx index a0665cb76d..a5eaf19e6a 100644 --- a/app/components/cards/PostFull.jsx +++ b/app/components/cards/PostFull.jsx @@ -238,8 +238,7 @@ class PostFull extends React.Component { } const readonly = post_content.get('mode') === 'archived' || $STM_Config.read_only_mode - //const showPromote = username && post_content.get('mode') === "first_payout" && post_content.get('depth') == 0 - const showPromote = false // TODO: revert when nodes are updated with https://github.com/steemit/steem/pull/550 + const showPromote = username && post_content.get('mode') === "first_payout" && post_content.get('depth') == 0 const showReplyOption = post_content.get('depth') < 6 const showEditOption = username === author const authorRepLog10 = repLog10(content.author_reputation) diff --git a/app/components/elements/Voting.jsx b/app/components/elements/Voting.jsx index 37720b6fc5..94b234bf38 100644 --- a/app/components/elements/Voting.jsx +++ b/app/components/elements/Voting.jsx @@ -161,9 +161,8 @@ class Voting extends React.Component { const up = ; const classUp = 'Voting__button Voting__button-up' + (myVote > 0 ? ' Voting__button--upvoted' : '') + (votingUpActive ? ' votingUp' : ''); - // TODO: clean up the date logic after shared-db upgrade - // There is an "active cashout" if: (a) there is a pending payout, OR (b) there is a valid cashout_time AND (it's a top level post OR a comment with at least 1 vote) - const cashout_active = pending_payout > 0 || (cashout_time && cashout_time.indexOf('1969') !== 0 && cashout_time.indexOf('1970') !== 0 && (active_votes.size > 0 || !is_comment)) + // There is an "active cashout" if: (a) there is a pending payout, OR (b) there is a valid cashout_time AND it's NOT a comment with 0 votes. + const cashout_active = pending_payout > 0 || (cashout_time.indexOf('1969') !== 0 && !(is_comment && active_votes.size == 0)) const payoutItems = []; if(cashout_active) { @@ -172,8 +171,7 @@ class Voting extends React.Component { if(promoted > 0) { payoutItems.push({value: 'Promotion Cost $' + formatDecimal(promoted).join('')}); } - const hide_cashout_532 = cashout_time.indexOf('1969') === 0 // tmpfix for #532. TODO: remove after shared-db - if (cashout_active && !hide_cashout_532) { + if(cashout_active) { payoutItems.push({value: }); } diff --git a/app/components/modules/Header.jsx b/app/components/modules/Header.jsx index bbf2a30c6d..d6351d8abf 100644 --- a/app/components/modules/Header.jsx +++ b/app/components/modules/Header.jsx @@ -153,7 +153,7 @@ class Header extends React.Component { ['hot', 'hot'], ['trending', 'trending (24 hour)'], ['trending30', 'trending (30 day)'], - //['promoted', 'promoted'], //TODO: reenable after shared-db upgrade + ['promoted', 'promoted'], ['active', 'active'] ]; if (current_account_name) sort_orders.unshift(['home', 'home']); @@ -164,7 +164,7 @@ class Header extends React.Component { ['created', 'new'], ['hot', 'hot'], ['trending', 'trending'], - //['promoted', 'promoted'], //TODO: reenable after shared-db upgrade + ['promoted', 'promoted'], ['active', 'active'] ]; if (current_account_name) sort_orders_horizontal.unshift(['home', 'home']); diff --git a/app/components/pages/TagsIndex.jsx b/app/components/pages/TagsIndex.jsx index d6e682d7c0..10d8d73e23 100644 --- a/app/components/pages/TagsIndex.jsx +++ b/app/components/pages/TagsIndex.jsx @@ -3,7 +3,7 @@ import { Link } from 'react-router'; import {connect} from 'react-redux'; import { browserHistory } from 'react-router'; -class TagsIndex extends React.Component { +export default class TagsIndex extends React.Component { static propTypes = { tagsList: React.PropTypes.object.isRequired, tagsAll: React.PropTypes.object.isRequired, @@ -36,7 +36,10 @@ class TagsIndex extends React.Component { const order = this.props.routeParams.order; let tags = tagsAll; if (search) tags = tags.filter(tag => tag.get('name').indexOf(search.toLowerCase()) !== -1); - tags = tags.filter(tag => tag.get('name')).sort((a,b) => { + tags = tags.filter( + // there is a blank tag present, as well as some starting with #. filter them out. + tag => /^[a-z]/.test(tag.get('name')) + ).sort((a,b) => { return a.get('name').localeCompare(b.get('name')); }).map(tag => { const name = tag.get('name'); @@ -46,7 +49,8 @@ class TagsIndex extends React.Component { {name} - {tag.get('discussions')} + {tag.get('top_posts')} + {tag.get('comments')} {tag.get('total_payouts')} ); }).toArray(); @@ -60,7 +64,8 @@ class TagsIndex extends React.Component { Tag - Replies + Posts + Comments Payouts @@ -74,17 +79,10 @@ class TagsIndex extends React.Component { } } -// TODO: use just 'tag_idx' and 'tags' after shared-db upgrade - -export default connect(state => ({ - tagsList: state.global.get('tag_idx') || state.global.get('category_idx'), - tagsAll: state.global.get('tags') || state.global.get('categories') -}))(TagsIndex); - module.exports = { path: 'tags.html(/:order)', component: connect(state => ({ - tagsList: state.global.get('tag_idx') || state.global.get('category_idx'), - tagsAll: state.global.get('tags') || state.global.get('categories') + tagsList: state.global.get('tag_idx'), + tagsAll: state.global.get('tags') }))(TagsIndex) }; diff --git a/app/components/pages/TagsIndex.scss b/app/components/pages/TagsIndex.scss index 053d6f2eb6..d6167aa9c0 100644 --- a/app/components/pages/TagsIndex.scss +++ b/app/components/pages/TagsIndex.scss @@ -1,6 +1,13 @@ .TagsIndex { - input { - margin-bottom: 0.5rem!important; + input { + margin-bottom: 0.5rem!important; + } + + table tr { + td, th { + text-align: right; + &:first-child {text-align: left;} } + } } diff --git a/app/components/pages/Topics.jsx b/app/components/pages/Topics.jsx index 8310829f27..f76ab4aa54 100644 --- a/app/components/pages/Topics.jsx +++ b/app/components/pages/Topics.jsx @@ -79,6 +79,5 @@ class Topics extends React.Component { } export default connect(state => ({ - // TODO: use 'tag_idx' after shared-db upgrade - categories: state.global.get('tag_idx') || state.global.get('category_idx') + categories: state.global.get('tag_idx') }))(Topics); diff --git a/app/components/pages/UserProfile.jsx b/app/components/pages/UserProfile.jsx index bcfe7224c8..5a3b8d95ca 100644 --- a/app/components/pages/UserProfile.jsx +++ b/app/components/pages/UserProfile.jsx @@ -184,9 +184,7 @@ export default class UserProfile extends React.Component { tab_content = } else if( section === 'comments' && account.post_history ) { - // NOTE: `posts` key will be renamed to `comments` (https://github.com/steemit/steem/issues/507) - // -- see also GlobalReducer.js - if( account.posts || account.comments ) + if( account.comments ) { let posts = accountImm.get('posts') || accountImm.get('comments'); if (!fetching && (posts && !posts.size)) { diff --git a/app/redux/FollowSaga.js b/app/redux/FollowSaga.js index 7d425e3ae2..ac9407bd60 100644 --- a/app/redux/FollowSaga.js +++ b/app/redux/FollowSaga.js @@ -1,4 +1,4 @@ -import {fromJS, Map, Set, List} from 'immutable' +import {fromJS, Map, Set} from 'immutable' import {call, put} from 'redux-saga/effects'; import {Apis} from 'shared/api_client'; @@ -29,10 +29,7 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { res.forEach(value => { cnt++ - let whatList = value.get('what') - if(typeof whatList === 'string') - whatList = new List([whatList]) // TODO: after shared-db upgrade, this line can be removed - + const whatList = value.get('what') const accountName = lastAccountName = value.get(accountNameKey) whatList.forEach(what => { //currently this is always true: what === type diff --git a/app/redux/GlobalReducer.js b/app/redux/GlobalReducer.js index cc3f8bf181..2132d998bb 100644 --- a/app/redux/GlobalReducer.js +++ b/app/redux/GlobalReducer.js @@ -152,9 +152,7 @@ export default createModule({ let new_state; if (order === 'by_author' || order === 'by_feed' || order === 'by_comments' || order === 'by_replies') { // category is either "blog", "feed", "comments", or "recent_replies" (respectively) -- and all posts are keyed under current profile - // one exception: "comments" category is keyed as "posts" in get_state (https://github.com/steemit/steem/issues/507) - const _legacy_compat = state.getIn(['accounts', accountname]).has("posts") //TODO: remove after switching to shared-db - const key = ['accounts', accountname, (_legacy_compat && category == "comments") ? "posts" : category] + const key = ['accounts', accountname, category] new_state = state.updateIn(key, List(), list => { return list.withMutations(posts => { data.forEach(value => { From 044c9060736031f5615658645e0539e84b489310 Mon Sep 17 00:00:00 2001 From: Mike Cifani Date: Tue, 6 Dec 2016 15:57:53 -0500 Subject: [PATCH 29/61] 765 resteem issue (#778) * Update mis-spelling of translate message * Gracefully handle outside click for confirm transaction, clicking outside not longer shows loading state spinner --- app/components/modules/ConfirmTransactionForm.jsx | 15 +++++++++++++-- app/components/modules/PromotePost.jsx | 2 +- app/locales/en.js | 2 +- app/locales/ru.js | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/components/modules/ConfirmTransactionForm.jsx b/app/components/modules/ConfirmTransactionForm.jsx index 4f06c603e8..07d782fe65 100644 --- a/app/components/modules/ConfirmTransactionForm.jsx +++ b/app/components/modules/ConfirmTransactionForm.jsx @@ -1,6 +1,7 @@ import React, { PropTypes, Component } from 'react'; import {connect} from 'react-redux' import transaction from 'app/redux/Transaction' +import {findParent} from 'app/utils/DomUtils'; class ConfirmTransactionForm extends Component { @@ -14,9 +15,19 @@ class ConfirmTransactionForm extends Component { confirmErrorCallback: PropTypes.func, okClick: PropTypes.func, }; + componentDidMount() { + document.body.addEventListener('click', this.closeOnOutsideClick); + } + componentWillUnmount() { + document.body.removeEventListener('click', this.closeOnOutsideClick); + } + closeOnOutsideClick = (e) => { + const inside_dialog = findParent(e.target, 'ConfirmTransactionForm'); + if (!inside_dialog) this.onCancel(); + } onCancel = () => { - const {confirmErrorCallback, onCancel} = this.props - if(confirmErrorCallback) confirmErrorCallback() + const {confirmErrorCallback, onCancel} = this.props; + if(confirmErrorCallback) confirmErrorCallback(); if(onCancel) onCancel() } okClick = () => { diff --git a/app/components/modules/PromotePost.jsx b/app/components/modules/PromotePost.jsx index 4a45a52853..2475c73b1e 100644 --- a/app/components/modules/PromotePost.jsx +++ b/app/components/modules/PromotePost.jsx @@ -121,7 +121,7 @@ export default connect( from: username, to: 'null', amount: parseFloat(amount, 10).toFixed(3) + ' ' + asset, memo: `@${author}/${permlink}`, - __config: {successMessage: translate('you_successdully_promoted_this_post') + '.'} + __config: {successMessage: translate('you_successfully_promoted_this_post') + '.'} } dispatch(transaction.actions.broadcastOperation({ type: 'transfer', diff --git a/app/locales/en.js b/app/locales/en.js index 9a6ae252c5..8653a2318e 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -503,7 +503,7 @@ const en = { // PormotePost.jsx promote_post: 'Promote Post', spend_your_DEBT_TOKEN_to_advertise_this_post: 'Spend your ' + DEBT_TOKEN + 's to advertise this post in the promoted content section', - you_successdully_promoted_this_post: 'You successfully promoted this post', + you_successfully_promoted_this_post: 'You successfully promoted this post', leave_this_unchecked_to_receive_half_your_reward: "Leave this unchecked to receive 1/2 your reward in " + VESTING_TOKEN + " and 1/2 in " + DEBT_TOKEN, pay_me_100_in_VESTING_TOKEN: 'Pay me 100% in ' + VESTING_TOKEN, requires_5_or_more_reddit_comment_karma: 'requires 5 or more Reddit comment karma', diff --git a/app/locales/ru.js b/app/locales/ru.js index 6be6ed0a08..c7b243c507 100644 --- a/app/locales/ru.js +++ b/app/locales/ru.js @@ -516,7 +516,7 @@ const ru = { leave_this_unchecked_to_receive_half_your_reward: 'не пытайтесь покинуть Омск', promote_post: 'Продвинуть пост', spend_your_DEBT_TOKEN_to_advertise_this_post: 'Используйте ваши ' + DEBT_TOKEN + ' чтобы прорекламировать этот пост в секции продвигаемого контента', - you_successdully_promoted_this_post: 'Вы успешно продвинули этот пост', + you_successfully_promoted_this_post: 'Вы успешно продвинули этот пост', pay_me_100_in_VESTING_TOKEN: 'Заплатите мне 100% в ' + VESTING_TOKEN, requires_5_or_more_reddit_comment_karma: 'необходимо 5 или больше Reddit кармы комментирования', this_post_was_hidden_due_to_low_ratings: 'Этот пост был скрыт из-за низкого рейтинга', From d84c20757cbd3919d974e45d56799a75c541920a Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 17:03:17 -0500 Subject: [PATCH 30/61] revert 'disable blocktrades' (#796) --- app/components/App.jsx | 4 ++-- app/components/modules/UserWallet.jsx | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/components/App.jsx b/app/components/App.jsx index 10fdee0aa9..89f0d1fc16 100644 --- a/app/components/App.jsx +++ b/app/components/App.jsx @@ -180,11 +180,11 @@ class App extends React.Component { FAQ
  • - {/*
  • +
  • depositSteem()}> {translate("buy_LIQUID_TOKEN")} -
  • */} +
  • {translate('APP_NAME_app_center')}  diff --git a/app/components/modules/UserWallet.jsx b/app/components/modules/UserWallet.jsx index b84dc81d39..6b2ea98395 100644 --- a/app/components/modules/UserWallet.jsx +++ b/app/components/modules/UserWallet.jsx @@ -19,7 +19,6 @@ import Tooltip from 'app/components/elements/Tooltip' import { translate } from 'app/Translator'; const assetPrecision = 1000; -const BLOCKTRADES_ENABLED = false; class UserWallet extends React.Component { constructor() { @@ -145,9 +144,9 @@ class UserWallet extends React.Component { { value: 'Power Down', link: '#', onClick: powerDown.bind(this, false) } ] if(isMyAccount) { - if(BLOCKTRADES_ENABLED) steem_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositSteem }) + steem_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositSteem }) steem_menu.push({ value: 'Buy or Sell', link: '/market' }) - if(BLOCKTRADES_ENABLED) power_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositPower }) + power_menu.push({ value: 'Deposit', link: '#', onClick: onShowDepositPower }) } if( divesting ) { power_menu.push( { value: 'Cancel Power Down', link:'#', onClick: powerDown.bind(this,true) } ); @@ -192,7 +191,7 @@ class UserWallet extends React.Component { {isMyAccount ? :

    BALANCES


    }
    - {isMyAccount && BLOCKTRADES_ENABLED && } + {isMyAccount && }
    From c2af22f8f22f2c6705dcfee803a48046c4d23d3e Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 6 Dec 2016 17:03:44 -0500 Subject: [PATCH 31/61] proper inflection for vote count (#794) --- app/locales/en.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/locales/en.js b/app/locales/en.js index 8653a2318e..f46c8c5d62 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -386,7 +386,11 @@ const en = { action: 'Action', APP_NAME_app_center: APP_NAME + ' App Center', witness_thread: 'witness thread', - you_have_votes_remaining: 'You have {votesCount} votes remaining', + you_have_votes_remaining: `You have {votesCount, plural, + =0 {no votes} + one {1 vote} + other {{votesCount} votes} + } remaining`, you_can_vote_for_maximum_of_witnesses: 'You can vote for a maximum of 30 witnesses', information: 'Information', if_you_want_to_vote_outside_of_top_enter_account_name: 'If you would like to vote for a witness outside of the top 50, enter the account name below to cast a vote', From 02c7dad077485997f2191763d8eefc5057b3b2c6 Mon Sep 17 00:00:00 2001 From: Sigve Date: Tue, 6 Dec 2016 17:24:19 -0500 Subject: [PATCH 32/61] Add ability to set witness proxy voter, #464 --- app/components/pages/Witnesses.jsx | 99 +++++++++++++++++++++++++----- app/locales/en.js | 8 ++- app/redux/GlobalReducer.js | 5 ++ 3 files changed, 94 insertions(+), 18 deletions(-) diff --git a/app/components/pages/Witnesses.jsx b/app/components/pages/Witnesses.jsx index 21dde3c152..d2aa9b0399 100644 --- a/app/components/pages/Witnesses.jsx +++ b/app/components/pages/Witnesses.jsx @@ -5,7 +5,8 @@ import links from 'app/utils/Links' import Icon from 'app/components/elements/Icon'; import transaction from 'app/redux/Transaction' import ByteBuffer from 'bytebuffer' -import {Set, is} from 'immutable' +import {is} from 'immutable' +import g from 'app/redux/GlobalReducer'; import { translate } from 'app/Translator'; const Long = ByteBuffer.Long @@ -23,7 +24,7 @@ class Witnesses extends React.Component { } constructor() { super() - this.state = {customUsername: ""} + this.state = {customUsername: "", proxy: "", proxyFailed: false} this.accountWitnessVote = (accountName, approve, e) => { e.preventDefault(); const {username, accountWitnessVote} = this.props @@ -34,22 +35,32 @@ class Witnesses extends React.Component { const customUsername = e.target.value; this.setState({customUsername}); } + this.accountWitnessProxy = (e) => { + e.preventDefault(); + const {username, accountWitnessProxy} = this.props; + accountWitnessProxy(username, this.state.proxy, (state) => { + this.setState(state); + }); + } } shouldComponentUpdate(np, ns) { return ( !is(np.witness_votes, this.props.witness_votes) || np.witnesses !== this.props.witnesses || + np.current_proxy !== this.props.current_proxy || np.username !== this.props.username || - ns.customUsername !== this.state.customUsername + ns.customUsername !== this.state.customUsername || + ns.proxy !== this.state.proxy || + ns.proxyFailed !== this.state.proxyFailed ); } render() { - const {props: {witness_votes}, state: {customUsername}, accountWitnessVote, onWitnessChange} = this - const sorted_witnesses = this.props.witnesses + const {props: {witness_votes, current_proxy}, state: {customUsername, proxy}, accountWitnessVote, + accountWitnessProxy, onWitnessChange} = this + const sorted_witnesses = this.props.witnesses .sort((a, b) => Long.fromString(String(b.get('votes'))).subtract(Long.fromString(String(a.get('votes'))).toString())); - const up = ; let witness_vote_count = 30 let rank = 1 @@ -89,7 +100,7 @@ class Witnesses extends React.Component { let addl_witnesses = false; if(witness_votes) { witness_vote_count -= witness_votes.size - addl_witnesses = witness_votes.filter(function(item) { + addl_witnesses = witness_votes.filter(item => { return !sorted_witnesses.has(item) }).map(item => { return ( @@ -115,12 +126,44 @@ class Witnesses extends React.Component {

    {translate('top_witnesses')}

    -

    + {current_proxy && current_proxy.length ? null : +

    {translate('you_have_votes_remaining', {votesCount: witness_vote_count})}.{' '} {translate('you_can_vote_for_maximum_of_witnesses')}. -

    +

    }
    + +
    +
    +

    {translate(current_proxy && current_proxy.length ? 'witness_set' : 'set_witness_proxy', {proxy: current_proxy})}

    + {current_proxy && current_proxy.length ? +
    +
    {translate("witness_proxy_current")}: {}
    + +
    +
    + +
    + +
    +
    +
    +
    : +
    +
    + {this.setState({proxy: e.target.value});}} /> +
    + +
    +
    +
    } + {this.state.proxyFailed &&

    {translate("proxy_update_error")}.

    } +
    +
    +
    + + {current_proxy && current_proxy.length ? null :
    @@ -136,19 +179,25 @@ class Witnesses extends React.Component {
    -
    +
    } + + {current_proxy && current_proxy.length ? null :

    {translate('if_you_want_to_vote_outside_of_top_enter_account_name')}.

    - - +
    + +
    + +
    +
    -
    +
    {addl_witnesses} -

    +

    -
    + } ); } @@ -162,22 +211,38 @@ module.exports = { const current_user = state.user.get('current'); const username = current_user && current_user.get('username') const current_account = current_user && state.global.getIn(['accounts', username]) - const witness_votes = current_account && Set(current_account.get('witness_votes')) + const witness_votes = current_account && current_account.get('witness_votes').toSet(); + const current_proxy = current_account && current_account.get('proxy'); return { witnesses: state.global.get('witnesses'), username, witness_votes, + current_proxy }; }, (dispatch) => { return { - // requestData: (args) => dispatch({type: 'REQUEST_DATA', payload: args}), accountWitnessVote: (username, witness, approve) => { dispatch(transaction.actions.broadcastOperation({ type: 'account_witness_vote', operation: {account: username, witness, approve}, })) }, + accountWitnessProxy: (account, proxy, stateCallback) => { + dispatch(transaction.actions.broadcastOperation({ + type: 'account_witness_proxy', + operation: {account, proxy}, + confirm: proxy.length ? "Set proxy to: " + proxy : "You are about to remove your proxy.", + successCallback: () => { + dispatch(g.actions.updateAccountWitnessProxy({account, proxy})); + stateCallback({proxyFailed: false, proxy: ""}); + }, + errorCallback: (e) => { + console.log('error:', e); + stateCallback({proxyFailed: true}); + } + })) + } } } )(Witnesses) diff --git a/app/locales/en.js b/app/locales/en.js index 0c4b4d3576..876a78349d 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -264,7 +264,7 @@ const en = { account_recovery_request_not_confirmed: "Account recovery request is not confirmed yet, please get back later, thank you for your patience.", vote: 'Vote', // context: to vote? (title attribute on voting button) witness: 'Witness', - top_witnesses: 'Top Witnesses', + top_witnesses: 'Witness Voting', // user's navigational menu feed: 'Feed', wallet: 'Wallet', @@ -388,6 +388,12 @@ const en = { witness_thread: 'witness thread', you_have_votes_remaining: 'You have {votesCount} votes remaining', you_can_vote_for_maximum_of_witnesses: 'You can vote for a maximum of 30 witnesses', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", + witness_proxy_current: "Your current proxy is", + witness_proxy_set: "Set proxy", + witness_proxy_clear: "Clear proxy", + proxy_update_error: "Your proxy was not updated", information: 'Information', if_you_want_to_vote_outside_of_top_enter_account_name: 'If you would like to vote for a witness outside of the top 50, enter the account name below to cast a vote', view_the_direct_parent: 'View the direct parent', diff --git a/app/redux/GlobalReducer.js b/app/redux/GlobalReducer.js index cc3f8bf181..c487529ccc 100644 --- a/app/redux/GlobalReducer.js +++ b/app/redux/GlobalReducer.js @@ -104,6 +104,11 @@ export default createModule({ state.updateIn(['accounts', account, 'witness_votes'], Set(), votes => (approve ? Set(votes).add(witness) : Set(votes).remove(witness))) }, + { // works... + action: 'UPDATE_ACCOUNT_WITNESS_PROXY', + reducer: (state, {payload: {account, proxy}}) => + state.setIn(['accounts', account, 'proxy'], proxy) + }, { action: 'DELETE_CONTENT', reducer: (state, {payload: {author, permlink}}) => { From c745db1e9b1df3832aa955943b3d65fef7eb83c8 Mon Sep 17 00:00:00 2001 From: James Calfee Date: Wed, 7 Dec 2016 13:29:06 -0600 Subject: [PATCH 33/61] Add checks for loading and loaded in FollowSaga. (close #799) --- app/redux/FetchDataSaga.js | 7 ++----- app/redux/FollowSaga.js | 33 +++++++++++++++++++++++++-------- app/redux/UserSaga.js | 2 -- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/app/redux/FetchDataSaga.js b/app/redux/FetchDataSaga.js index e6b291c0d8..8fb80af62d 100644 --- a/app/redux/FetchDataSaga.js +++ b/app/redux/FetchDataSaga.js @@ -26,11 +26,8 @@ export function* fetchState(location_change_action) { const m = pathname.match(/^\/@([a-z0-9\.-]+)/) if(m && m.length === 2) { const username = m[1] - const hasFollows = yield select(state => state.global.hasIn(['follow', 'get_followers', username])) - if(!hasFollows) { - yield fork(loadFollows, "get_followers", username, 'blog') - yield fork(loadFollows, "get_following", username, 'blog') - } + yield fork(loadFollows, "get_followers", username, 'blog') + yield fork(loadFollows, "get_following", username, 'blog') } const server_location = yield select(state => state.offchain.get('server_location')); if (pathname === server_location) return; diff --git a/app/redux/FollowSaga.js b/app/redux/FollowSaga.js index ac9407bd60..fc5bc52131 100644 --- a/app/redux/FollowSaga.js +++ b/app/redux/FollowSaga.js @@ -1,5 +1,5 @@ import {fromJS, Map, Set} from 'immutable' -import {call, put} from 'redux-saga/effects'; +import {call, put, select} from 'redux-saga/effects'; import {Apis} from 'shared/api_client'; /** @@ -7,13 +7,19 @@ import {Apis} from 'shared/api_client'; */ // Test limit with 2 (not 1, infinate looping) -export function* loadFollows(method, account, type, start = '', limit = 100) { - const res = fromJS(yield Apis.follow(method, account, start, type, limit)) - // console.log('res.toJS()', res.toJS()) +export function* loadFollows(method, account, type, force = false) { + if(yield select(state => state.global.getIn(['follow', method, account, type + '_loading']))) { + // console.log('Already loading', method, account, type) + return + } - let cnt = 0 - let lastAccountName = null - const accountNameKey = method === "get_following" ? "following" : "follower"; + if(!force) { + const hasResult = yield select(state => state.global.hasIn(['follow', method, account, type + '_result'])) + if(hasResult) { + // console.log('Already loaded', method, account, type) + return + } + } yield put({type: 'global/UPDATE', payload: { key: ['follow', method, account], @@ -21,6 +27,16 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { updater: m => m.set(type + '_loading', true), }}) + yield loadFollowsLoop(method, account, type) +} + +function* loadFollowsLoop(method, account, type, start = '', limit = 100) { + const res = fromJS(yield Apis.follow(method, account, start, type, limit)) + // console.log('res.toJS()', res.toJS()) + + let cnt = 0 + let lastAccountName = null + yield put({type: 'global/UPDATE', payload: { key: ['follow_inprogress', method, account], notSet: Map(), @@ -30,6 +46,7 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { cnt++ const whatList = value.get('what') + const accountNameKey = method === "get_following" ? "following" : "follower"; const accountName = lastAccountName = value.get(accountNameKey) whatList.forEach(what => { //currently this is always true: what === type @@ -42,7 +59,7 @@ export function* loadFollows(method, account, type, start = '', limit = 100) { if(cnt === limit) { // This is paging each block of up to limit results - yield call(loadFollows, method, account, type, lastAccountName) + yield call(loadFollowsLoop, method, account, type, lastAccountName) } else { // This condition happens only once at the very end of the list. // Every account has a different followers and following list for: blog, ignore diff --git a/app/redux/UserSaga.js b/app/redux/UserSaga.js index a06851fe35..1a8db68e55 100644 --- a/app/redux/UserSaga.js +++ b/app/redux/UserSaga.js @@ -84,8 +84,6 @@ function* removeHighSecurityKeys({payload: {pathname}}) { yield put(user.actions.removeHighSecurityKeys()) } - - /** @arg {object} action.username - Unless a WIF is provided, this is hashed with the password and key_type to create private keys. @arg {object} action.password - Password or WIF private key. A WIF becomes the posting key, a password can create all three From 9ca8201e138252be787773a144a2271c9dc048b6 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 7 Dec 2016 15:42:40 -0500 Subject: [PATCH 34/61] medium-5 seems to work better on 1024w window --- app/components/cards/PostFull.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/cards/PostFull.jsx b/app/components/cards/PostFull.jsx index dcd7b20c52..fbfd28fc66 100644 --- a/app/components/cards/PostFull.jsx +++ b/app/components/cards/PostFull.jsx @@ -267,7 +267,7 @@ class PostFull extends React.Component { -
    +
    {!readonly && } {!readonly && From ff55619af59291e977ac93eff5d04962cce337a5 Mon Sep 17 00:00:00 2001 From: Sigve Date: Wed, 7 Dec 2016 16:16:06 -0500 Subject: [PATCH 35/61] Display conversions in progress, add them to account value, fix #260 --- app/components/modules/UserWallet.jsx | 30 ++++++++++++++++++++++----- app/locales/en.js | 2 ++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/components/modules/UserWallet.jsx b/app/components/modules/UserWallet.jsx index 6b2ea98395..2f9e545d18 100644 --- a/app/components/modules/UserWallet.jsx +++ b/app/components/modules/UserWallet.jsx @@ -44,7 +44,6 @@ class UserWallet extends React.Component { const gprops = this.props.gprops.toJS(); if (!account) return null; - let vesting_steemf = vestingSteem(account.toJS(), gprops); let vesting_steem = vesting_steemf.toFixed(3); @@ -74,6 +73,7 @@ class UserWallet extends React.Component { this.props.withdrawVesting({account: name, vesting_shares, errorCallback, successCallback}) } + // Sum savings withrawals let savings_pending = 0, savings_sbd_pending = 0 if(savings_withdraws) { savings_withdraws.forEach(withdraw => { @@ -87,19 +87,36 @@ class UserWallet extends React.Component { }) } + // Sum conversions + let conversionValue = 0; + const conversions = account.get('other_history').filter(a => { + return a.getIn([1, 'op', 0]) === 'convert'; + }).map(c => { + const timestamp = new Date(c.getIn([1, 'timestamp'])).getTime(); + const finishTime = timestamp + (86400000 * (timestamp <= 1481040000000 ? 7 : 3.5)); // add conversion delay before/after hardfork change + const amount = parseFloat(c.getIn([1, 'op', 1, 'amount']).replace(" SBD", "")); + conversionValue += amount; + return ( +
    + + (+{translate('in_conversion', {amount: numberWithCommas('$' + amount.toFixed(3))})}) + +
    + ); + }) + const balance_steem = parseFloat(account.get('balance').split(' ')[0]); const saving_balance_steem = parseFloat(savings_balance.split(' ')[0]); - const total_steem = (vesting_steemf + balance_steem + saving_balance_steem + savings_pending).toFixed(3); const divesting = parseFloat(account.get('vesting_withdraw_rate').split(' ')[0]) > 0.000000; const sbd_balance = parseFloat(account.get('sbd_balance')) const sbd_balance_savings = parseFloat(savings_sbd_balance.split(' ')[0]); - const total_sbd = sbd_balance + sbd_balance_savings + savings_sbd_pending const sbdOrders = (!open_orders || !isMyAccount) ? 0 : open_orders.reduce((o, order) => { if (order.sell_price.base.indexOf("SBD") !== -1) { o += order.for_sale; } return o; }, 0) / assetPrecision; + const steemOrders = (!open_orders || !isMyAccount) ? 0 : open_orders.reduce((o, order) => { if (order.sell_price.base.indexOf("STEEM") !== -1) { o += order.for_sale; @@ -108,6 +125,8 @@ class UserWallet extends React.Component { }, 0) / assetPrecision; // set displayed estimated value + const total_sbd = sbd_balance + sbd_balance_savings + savings_sbd_pending + sbdOrders + conversionValue; + const total_steem = vesting_steemf + balance_steem + saving_balance_steem + savings_pending + steemOrders; let total_value = '$' + numberWithCommas( ((total_steem * price_per_steem) + total_sbd ).toFixed(2)) @@ -202,7 +221,7 @@ class UserWallet extends React.Component { {isMyAccount ? : steem_balance_str + ' STEEM'} - {steemOrders ?
    (+{steem_orders_balance_str} STEEM)
    : null} + {steemOrders ?
    (+{steem_orders_balance_str} STEEM)
    : null}
    @@ -223,7 +242,8 @@ class UserWallet extends React.Component { {isMyAccount ? : sbd_balance_str} - {sbdOrders ?
    (+{sbd_orders_balance_str})
    : null} + {sbdOrders ?
    (+{sbd_orders_balance_str})
    : null} + {conversions}
    diff --git a/app/locales/en.js b/app/locales/en.js index f46c8c5d62..1c0c580e89 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -213,6 +213,8 @@ const en = { invalid_amount: 'Invalid amount', insufficent_balance: 'Insufficient balance', in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'In 3.5 days, convert {amount} ' + DEBT_TOKEN + 's into ' + LIQUID_TOKEN, + in_conversion: "{amount} in conversion", + conversion_complete_tip: "Will complete on", order_placed: 'Order placed', // ex.: "Order placed: Sell {someamount_to_sell} for atleast {min_to_receive}" follow: 'Follow', unfollow: 'Unfollow', From 18de923e8482794395e43346ea5ea5a045257db2 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Wed, 7 Dec 2016 23:59:51 -0500 Subject: [PATCH 36/61] fixed grammar --- app/locales/en.js | 4 ++-- app/locales/es.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/locales/en.js b/app/locales/en.js index f46c8c5d62..176f9f59ba 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -40,7 +40,7 @@ const en = { submit_email_to_get_on_waiting_list: 'Submit your email to get on the waiting list', login: 'Login', logout: 'Logout', - show_less_low_value_posts: "Show less low value posts", + show_less_low_value_posts: "Show fewer low value posts", show_more_low_value_posts: "Show more low value posts", select_topic: 'Select Topic', tags_and_topics: "Tags and Topics", @@ -502,7 +502,7 @@ const en = { dismiss: 'Dismiss', // next 3 strings are used conditionally together show_more: 'Show more', - show_less: 'Show less', + show_less: 'Show fewer', value_posts: 'low value posts', // PormotePost.jsx promote_post: 'Promote Post', diff --git a/app/locales/es.js b/app/locales/es.js index c4d9237259..6c65d95a46 100644 --- a/app/locales/es.js +++ b/app/locales/es.js @@ -30,7 +30,7 @@ const es = { submit_email_to_get_on_waiting_list: 'Submit your email to get on the waiting list', login: 'Entrar', logout: 'Salir', - show_less_low_value_posts: "Show less low value posts", + show_less_low_value_posts: "Show fewer low value posts", show_more_low_value_posts: "Show more low value posts", select_topic: 'Seleccionar Tópicos', tags_and_topics: "Tags y Tópicos", From 18c2b5b0513ac5fcf1bea1605225e857cb64c9b0 Mon Sep 17 00:00:00 2001 From: Sigve Kvalsvik Date: Thu, 8 Dec 2016 00:01:21 -0500 Subject: [PATCH 37/61] 380 unknown account flash (#801) * Improve the loading blacklist logic in AppReducer * Show loading indicator while fetching accounts fix #380 --- app/components/pages/UserProfile.jsx | 13 +++++++++---- app/redux/AppReducer.js | 3 +-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/components/pages/UserProfile.jsx b/app/components/pages/UserProfile.jsx index 5a3b8d95ca..ffcb41bda1 100644 --- a/app/components/pages/UserProfile.jsx +++ b/app/components/pages/UserProfile.jsx @@ -104,12 +104,18 @@ export default class UserProfile extends React.Component { if( section == 'posts' ) section = 'comments'; // const isMyAccount = current_user ? current_user.get('username') === accountname : false; + + // Loading status + const status = global_status ? global_status.getIn([section, 'by_author']) : null; + const fetching = (status && status.fetching) || this.props.loading; + let account let accountImm = this.props.accounts.get(accountname); if( accountImm ) { account = accountImm.toJS(); - } - else { + } else if (fetching) { + return
    ; + } else { return
    {translate('unknown_account')}
    } @@ -124,8 +130,7 @@ export default class UserProfile extends React.Component { let tab_content = null; // const global_status = this.props.global.get('status'); - const status = global_status ? global_status.getIn([section, 'by_author']) : null; - const fetching = (status && status.fetching) || this.props.loading; + // let balance_steem = parseFloat(account.balance.split(' ')[0]); // let vesting_steem = vestingSteem(account, gprops).toFixed(2); diff --git a/app/redux/AppReducer.js b/app/redux/AppReducer.js index 74e036a8b7..684d11a610 100644 --- a/app/redux/AppReducer.js +++ b/app/redux/AppReducer.js @@ -48,7 +48,7 @@ export default function reducer(state = defaultState, action) { const loadingIgnored = loadingBlacklist.indexOf(action.payload.method) !== -1; if (action.payload.event === 'BEGIN') { res = state.mergeDeep({ - loading: loadingIgnored ? false : true, + loading: loadingIgnored ? state.get('loading') : true, // reuse current loading state if the method is blacklisted requests: {[request_id]: Date.now()}, ignoredLoadingRequestCount: state.get('ignoredLoadingRequestCount') + (loadingIgnored ? 1 : 0) }); @@ -56,7 +56,6 @@ export default function reducer(state = defaultState, action) { if (action.payload.event === 'END' || action.payload.event === 'ERROR') { const ignoredLoadingRequestCount = state.get('ignoredLoadingRequestCount') - (loadingIgnored ? 1 : 0); res = res.deleteIn(['requests', request_id]); - // console.log("RPC_REQUEST END:", action.payload.method, res.get('requests').size, "ignoredLoadingRequestCount", ignoredLoadingRequestCount); const loading = (res.get('requests').size - ignoredLoadingRequestCount) > 0; res = res.mergeDeep({ loading, From adb16036ca246dec415a51d662c1fd1297adf287 Mon Sep 17 00:00:00 2001 From: Sigve Kvalsvik Date: Thu, 8 Dec 2016 00:05:03 -0500 Subject: [PATCH 38/61] Login form transfer updates (#798) * Set initial username in LoginForm, focus on password if set * Add @ prefix to Transfer account inputs, restyle asset selection * Adjust Transfer margins and fix asset.error check position --- app/components/modules/LoginForm.jsx | 26 +++++------- app/components/modules/Transfer.jsx | 63 +++++++++++++++++++--------- 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/app/components/modules/LoginForm.jsx b/app/components/modules/LoginForm.jsx index 5b055f416f..e09d98a755 100644 --- a/app/components/modules/LoginForm.jsx +++ b/app/components/modules/LoginForm.jsx @@ -1,6 +1,5 @@ /* eslint react/prop-types: 0 */ import React, { PropTypes, Component } from 'react'; -import ReactDOM from 'react-dom'; import {PublicKey, PrivateKey} from 'shared/ecc' import transaction from 'app/redux/Transaction' import g from 'app/redux/GlobalReducer' @@ -50,15 +49,9 @@ class LoginForm extends Component { this.initForm(props) } - componentWillMount() { - // Use username.value as the defult (input types should not contain both value and defaultValue) - const username = {...this.state.username} - username.value = this.props.initialUsername - this.setState({username}) - } - componentDidMount() { - if (this.refs.username) ReactDOM.findDOMNode(this.refs.username).focus() + if (this.refs.username && !this.refs.username.value) this.refs.username.focus(); + if (this.refs.username && this.refs.username.value) this.refs.pw.focus(); } shouldComponentUpdate = shouldComponentUpdate(this, 'LoginForm') @@ -168,11 +161,13 @@ class LoginForm extends Component { onChange={this.props.clearError} method="post" > -
    - -
    {username.touched && username.blur && username.error} 
    +
    + @ +
    + {username.touched && username.blur && username.error ?
    {username.error} 
    : null}
    @@ -251,12 +246,13 @@ export default connect( } // The username input has a value prop, so it should not use initialValues - const initialUsername = currentUser && currentUser.has('username') ? currentUser.get('username') : urlAccountName() - + const initialUsername = currentUser && currentUser.has('username') ? currentUser.get('username') : urlAccountName() const loginDefault = state.user.get('loginDefault') if(loginDefault) { const {username, authType} = loginDefault.toJS() if(username && authType) initialValues.username = username + '/' + authType + } else if (initialUsername) { + initialValues.username = initialUsername; } let msg = ''; const msg_match = window.location.hash.match(/msg\=([\w]+)/); diff --git a/app/components/modules/Transfer.jsx b/app/components/modules/Transfer.jsx index 5923eff85e..443a1b201f 100644 --- a/app/components/modules/Transfer.jsx +++ b/app/components/modules/Transfer.jsx @@ -149,19 +149,36 @@ class TransferForm extends Component {
    }
    -
    From
    +
    From
    - {currentUser.get('username')} +
    + @ + +
    -
    - {advanced &&
    -
    To
    +
    To
    - +
    + @ + +
    {to.touched && to.blur && to.error ?
    {to.error} 
    :

    {toVesting && powerTip3}

    @@ -170,24 +187,30 @@ class TransferForm extends Component {
    }
    -
    Amount
    +
    Amount
    - {asset && - - } - -
    {asset && asset.touched && asset.error && asset.error} 
    - -
    {amount.touched && amount.error && amount.error} 
    +
    + + {asset && + + } +
    +
    + +
    + {(asset && asset.touched && asset.error ) || (amount.touched && amount.error) ? +
    + {asset && asset.touched && asset.error && asset.error}  + {amount.touched && amount.error && amount.error}  +
    : null}
    {memo &&
    -
    Memo
    +
    Memo
    This Memo is {isMemoPrivate ? 'Private' : 'Public'} Date: Thu, 8 Dec 2016 00:07:17 -0500 Subject: [PATCH 39/61] removed s erroneous plural suffix removed s erroneous plural suffix from DEBT_TOKEN in in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN --- app/locales/en.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locales/en.js b/app/locales/en.js index 1c0c580e89..d8fc367108 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -212,7 +212,7 @@ const en = { convert: 'Convert', invalid_amount: 'Invalid amount', insufficent_balance: 'Insufficient balance', - in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'In 3.5 days, convert {amount} ' + DEBT_TOKEN + 's into ' + LIQUID_TOKEN, + in_week_convert_DEBT_TOKEN_to_LIQUID_TOKEN: 'In 3.5 days, convert {amount} ' + DEBT_TOKEN + ' into ' + LIQUID_TOKEN, in_conversion: "{amount} in conversion", conversion_complete_tip: "Will complete on", order_placed: 'Order placed', // ex.: "Order placed: Sell {someamount_to_sell} for atleast {min_to_receive}" From 3d82e31bbebce92bd6a943f92d3d923899abe9b1 Mon Sep 17 00:00:00 2001 From: Sigve Date: Thu, 8 Dec 2016 11:26:59 -0500 Subject: [PATCH 40/61] Add zebra stripes to wallet page fix #813 --- app/components/modules/UserWallet.jsx | 10 ++-------- app/components/modules/UserWallet.scss | 5 +++++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/components/modules/UserWallet.jsx b/app/components/modules/UserWallet.jsx index 2f9e545d18..1e8198b056 100644 --- a/app/components/modules/UserWallet.jsx +++ b/app/components/modules/UserWallet.jsx @@ -224,7 +224,7 @@ class UserWallet extends React.Component { {steemOrders ?
    (+{steem_orders_balance_str} STEEM)
    : null}
    -
    +
    STEEM POWER
    {powerTip.split(".").map((a, index) => {if (a) {return
    {a}.
    ;} return null;})}
    @@ -246,7 +246,7 @@ class UserWallet extends React.Component { {conversions}
    -
    +
    SAVINGS
    {savingsTip}
    @@ -260,12 +260,6 @@ class UserWallet extends React.Component { : savings_sbd_balance_str}
    -
    -
    -
    -
    -
    -
    Estimated Account Value
    {valueTip} diff --git a/app/components/modules/UserWallet.scss b/app/components/modules/UserWallet.scss index f3640cbcf3..4c5ec5bdf9 100644 --- a/app/components/modules/UserWallet.scss +++ b/app/components/modules/UserWallet.scss @@ -1,5 +1,10 @@ .UserWallet__balance { padding-bottom: 1rem; + padding-top: 1rem; + + &.UserWallet__balance.zebra { + background: #f2f2f2; + } } .UserWallet__buysp { From 1a78f7bfa0ec58ae32f674a5b7071df6909e0b97 Mon Sep 17 00:00:00 2001 From: Sigve Date: Thu, 8 Dec 2016 11:43:22 -0500 Subject: [PATCH 41/61] Add new strings to all locale files --- app/locales/es.js | 5 +++++ app/locales/es_AR.js | 6 ++++++ app/locales/fr.js | 5 +++++ app/locales/it.js | 7 ++++++- app/locales/jp.js | 5 +++++ app/locales/ru.js | 5 +++++ 6 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/locales/es.js b/app/locales/es.js index 1b27144143..2fc2d6a4f3 100644 --- a/app/locales/es.js +++ b/app/locales/es.js @@ -372,6 +372,11 @@ const es = { witness_thread: 'witness thread', you_have_votes_remaining: 'You have {votesCount} votes remaining', you_can_vote_for_maximum_of_witnesses: 'You can vote for a maximum of 30 witnesses', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", // FIXME + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", // FIXME + witness_proxy_current: "Your current proxy is", // FIXME + witness_proxy_set: "Set proxy", // FIXME + witness_proxy_clear: "Clear proxy", // FIXME information: 'Información', if_you_want_to_vote_outside_of_top_enter_account_name: 'If you would like to vote for a witness outside of the top 50, enter the account name below to cast a vote', view_the_direct_parent: 'Vista directa del padre', diff --git a/app/locales/es_AR.js b/app/locales/es_AR.js index 123588e179..e72d778237 100644 --- a/app/locales/es_AR.js +++ b/app/locales/es_AR.js @@ -372,6 +372,12 @@ const es_AR = { witness_thread: 'hilo de testigo', you_have_votes_remaining: 'Te quedan {votesCount} votos disponibles', you_can_vote_for_maximum_of_witnesses: 'Podés votar un máximo de 30 testigos', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", // FIXME + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", // FIXME + witness_proxy_current: "Your current proxy is", // FIXME + witness_proxy_set: "Set proxy", // FIXME + witness_proxy_clear: "Clear proxy", // FIXME + proxy_update_error: "Your proxy was not updated", information: 'Información', if_you_want_to_vote_outside_of_top_enter_account_name: 'Si te gustaría votar un testigo fuera del top 50, ingresá el nombre de su cuenta abajo para emitir tu voto.', view_the_direct_parent: 'Vista directa del padre', diff --git a/app/locales/fr.js b/app/locales/fr.js index e9d0a3e4c8..045cc2883d 100644 --- a/app/locales/fr.js +++ b/app/locales/fr.js @@ -372,6 +372,11 @@ const fr = { witness_thread: 'witness thread', you_have_votes_remaining: 'You have {votesCount} votes remaining', you_can_vote_for_maximum_of_witnesses: 'You can vote for a maximum of 30 witnesses', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", // FIXME + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", // FIXME + witness_proxy_current: "Your current proxy is", // FIXME + witness_proxy_set: "Set proxy", // FIXME + witness_proxy_clear: "Clear proxy", // FIXME information: 'Information', if_you_want_to_vote_outside_of_top_enter_account_name: 'If you would like to vote for a witness outside of the top 50, enter the account name below to cast a vote', view_the_direct_parent: 'View the direct parent', diff --git a/app/locales/it.js b/app/locales/it.js index 678468e95b..e2a8362e8a 100644 --- a/app/locales/it.js +++ b/app/locales/it.js @@ -372,6 +372,11 @@ const it = { witness_thread: 'witness thread', you_have_votes_remaining: 'Hai ancora {votesCount} upvote rimasti', you_can_vote_for_maximum_of_witnesses: 'puoi votare per un massimo di 30 witnesses', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", // FIXME + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", // FIXME + witness_proxy_current: "Your current proxy is", // FIXME + witness_proxy_set: "Set proxy", // FIXME + witness_proxy_clear: "Clear proxy", // FIXME information: 'Informationi', if_you_want_to_vote_outside_of_top_enter_account_name: 'Se vuoi votare per un witness al di fuori della top 50, scrivine il nome account ed esegui un upvote', view_the_direct_parent: 'Visualizza cartella principale', @@ -416,7 +421,7 @@ const it = { posting_key_is_required_it_should_be_different: 'La posting key è utilizzata per creare e votare post. Dovrebbe essere differente dalla active key e dalla owner key.', the_active_key_is_used_to_make_transfers_and_place_orders: 'L\'active key è utilizzata per trasferire e piazzare ordini nel mercato interno.', the_owner_key_is_required_to_change_other_keys: 'L\'owner key è la chiave master dell\'account e viene utilizzata per modificare tutte le altre.', - the_private_key_or_password_should_be_kept_offline: 'La private key o la password proprietaria dovrebbero essere tenute offline il più possibile.', + the_private_key_or_password_should_be_kept_offline: 'La private key o la password proprietaria dovrebbero essere tenute offline il più possibile.', the_memo_key_is_used_to_create_and_read_memos: 'La memo key è utilizzata per creare e visualizzare memo.', previous: 'Precedente', next: 'Prossimo', diff --git a/app/locales/jp.js b/app/locales/jp.js index e12247f370..dc5e6ed8ac 100644 --- a/app/locales/jp.js +++ b/app/locales/jp.js @@ -372,6 +372,11 @@ const jp = { witness_thread: 'witnessのスレッド', you_have_votes_remaining: 'あなたは {votesCount} votesが残っています', you_can_vote_for_maximum_of_witnesses: '最大で30 Witnesses に投票することができます。', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", // FIXME + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", // FIXME + witness_proxy_current: "Your current proxy is", // FIXME + witness_proxy_set: "Set proxy", // FIXME + witness_proxy_clear: "Clear proxy", // FIXME information: 'Information', if_you_want_to_vote_outside_of_top_enter_account_name: 'もし、トップ50位以外のWitnessに投票したい場合、投票をする前に、アカウント名を入れてください。', view_the_direct_parent: 'View the direct parent', diff --git a/app/locales/ru.js b/app/locales/ru.js index b2c70e0d87..461d69d963 100644 --- a/app/locales/ru.js +++ b/app/locales/ru.js @@ -398,6 +398,11 @@ const ru = { witness_thread: 'пост делегата', you_have_votes_remaining: 'У вас осталось {votesCount} голосов', you_can_vote_for_maximum_of_witnesses: 'Вы можете голосовать максимум за 30 делегатов', + set_witness_proxy: "You can also choose a proxy that will vote for witnesses for you. This will reset your current witness selection.", // FIXME + witness_set: "You have set a voting proxy. If you would like to reenable manual voting, please clear your proxy.", // FIXME + witness_proxy_current: "Your current proxy is", // FIXME + witness_proxy_set: "Set proxy", // FIXME + witness_proxy_clear: "Clear proxy", // FIXME information: 'Информация', if_you_want_to_vote_outside_of_top_enter_account_name: 'Если вы хотите проголосовать за делегата вне top 50, введите имя аккаунта ниже', view_the_direct_parent: 'Просмотр прямого родителя', From 2c361085cd8e3ebb16fea23f7342c0e01b4b3fbf Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Thu, 8 Dec 2016 17:46:24 -0500 Subject: [PATCH 42/61] fix post footer promo text (#822) --- app/components/pages/Post.jsx | 2 +- app/locales/en.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/pages/Post.jsx b/app/components/pages/Post.jsx index 9edb4db890..3a4e0fd7aa 100644 --- a/app/components/pages/Post.jsx +++ b/app/components/pages/Post.jsx @@ -173,7 +173,7 @@ class Post extends React.Component {
    {translate('authors_get_paid_when_people_like_you_upvote_their_post')}.
    {// remove '$' from signup_bonus before parsing it into local currency - translate('if_you_enjoyed_what_you_read_earn_amount', {amount: localizedCurrency(signup_bonus.substring(1))})} + translate('if_you_enjoyed_what_you_read_earn_amount', {amount: '$'+localizedCurrency(signup_bonus.substring(1))})}
    {translate('when_you') + ' '}
    {translate('when_you_link_text')} {' ' + translate('and_vote_for_it') + '.'} diff --git a/app/locales/en.js b/app/locales/en.js index 6c4095c9c2..495b6d123a 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -31,7 +31,7 @@ const en = { // next 5 strings were supposed to be sinngle block of text, but due large size, // code erros they were splitted. authors_get_paid_when_people_like_you_upvote_their_post: 'Authors get paid when people like you upvote their post', - if_you_enjoyed_what_you_read_earn_amount: 'If you enjoyed what you read here, earn {amount} ' + VESTING_TOKEN, + if_you_enjoyed_what_you_read_earn_amount: 'If you enjoyed what you read here, earn {amount} of ' + VESTING_TOKEN, when_you: "when you", when_you_link_text: 'Sign Up', and_vote_for_it: 'and vote for it', From 105293a94a208793bf647b22e75b26b62d763158 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Thu, 8 Dec 2016 17:46:55 -0500 Subject: [PATCH 43/61] translation of BlocktradesDeposit (#821) --- app/components/modules/BlocktradesDeposit.jsx | 84 +++++++++++-------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/app/components/modules/BlocktradesDeposit.jsx b/app/components/modules/BlocktradesDeposit.jsx index 071bfd4a22..9f47b041cd 100644 --- a/app/components/modules/BlocktradesDeposit.jsx +++ b/app/components/modules/BlocktradesDeposit.jsx @@ -8,18 +8,21 @@ import g from 'app/redux/GlobalReducer' import QRCode from 'react-qr' import {steemTip, powerTip, powerTip2} from 'app/utils/Tips' import {cleanReduxInput} from 'app/utils/ReduxForms' +import { translate } from 'app/Translator.js'; +import { formatCoins } from 'app/utils/FormatCoins'; +import { APP_NAME, APP_ICON, DEBT_TOKEN, DEBT_TOKEN_SHORT, LIQUID_TOKEN, CURRENCY_SIGN, VESTING_TOKEN, VEST_TICKER, LIQUID_TICKER } from 'config/client_config'; const coinNames = { - STEEM: 'Steem', - VESTS: 'Steem Power', + [LIQUID_TICKER]: LIQUID_TOKEN, + [VEST_TICKER]: VESTING_TOKEN, BTC: 'Bitcoin', BTS: 'Bitshares', ETH: 'Ether', } const coinToTypes = [ - ['STEEM', 'steem'], - ['VESTS', 'steem_power'], + [LIQUID_TICKER, 'steem'], + [VEST_TICKER, 'steem_power'], ['BTC', 'btc'], ['BTS', 'bts'], ['ETH', 'eth'], @@ -128,7 +131,7 @@ class BlocktradesDeposit extends React.Component { const {fields: {inputCoin, outputCoin, amount}, submitting, handleSubmit} = this.props const hasError = userTradeError != null const est = getEstimatedValue(this.props, flip) - const getAddressLabel = inputAddress ? 'Change Deposit Address' : 'Get Deposit Address' + const getAddressLabel = translate(inputAddress ? 'change_deposit_address' : 'get_deposit_address') const arrowIcon = const flipIcon = const estimateInputCoin = flip ? coinName(outputCoin.value) : coinName(inputCoin.value) @@ -148,21 +151,24 @@ class BlocktradesDeposit extends React.Component { {/*{trHashLink(outputCoin.value, tr.outputTransactionHash)} */}
    ) - const depositTip = outputCoin.value === 'STEEM' ? steemTip : - outputCoin.value === 'VESTS' ?
    -

    {powerTip}

    -

    {powerTip2}

    + const depositTip = outputCoin.value === LIQUID_TICKER + ? translate('tradeable_tokens_that_may_be_transferred_anywhere_at_anytime') + + ' ' + + translate('LIQUID_TOKEN_can_be_converted_to_VESTING_TOKEN_in_a_process_called_powering_up') + : outputCoin.value === VEST_TICKER ?
    +

    {translate('influence_tokens_which_earn_more_power_by_holding_long_term') + ' ' + translate('the_more_you_hold_the_more_you_influence_post_rewards')}

    +

    {translate('VESTING_TOKEN_is_non_transferrable_and_requires_convert_back_to_LIQUID_TOKEN')}

    : null const selectOutputCoin = - +   - + - +   - + const coin_menu = [ @@ -174,14 +180,17 @@ class BlocktradesDeposit extends React.Component { value: 'Bitshares', icon: 'bitshares', link: '#'}, ]; const selectInputCoin = - const estimateButtonLabel = est.inputAmount != null ? 'Update Estimate' : 'Get Estimate' + const estimateButtonLabel = translate(est.inputAmount != null ? 'update_estimate' : 'get_estimate') const sendTo = - Send {amount.value} {coinName(inputCoin.value)} to  + {translate("send_amount_of_coins_to", { + value: amount.value, + coinName: coinName(inputCoin.value) + }) + ' '} { inputAddress && !hasError ? {inputAddress} {inputAddressMemo &&
    - Memo: {inputAddressMemo}
    - You must include the memo above… + {translate("memo")}: {inputAddressMemo}
    + {translate("must_include_memo")}…
    }
    : } @@ -189,9 +198,9 @@ class BlocktradesDeposit extends React.Component { return
    -

    Buy {coinName(outputCoin.value)}

    +

    {translate('buy') + ' ' + coinName(outputCoin.value)}

    {selectOutputCoin} - +
    {depositTip}
    @@ -199,13 +208,17 @@ class BlocktradesDeposit extends React.Component {
    {fetchEstimate()})}>
    -
    {est.inputAmount} {coinName(inputCoin.value, true)} {arrowIcon} {est.outputAmount} {coinName(outputCoin.value, true)}
    +
    + {est.inputAmount} {coinName(inputCoin.value, true)} {arrowIcon} {est.outputAmount} {formatCoins(coinName(outputCoin.value, true))} +
    - + {flipIcon}
    {amount.touched && amount.error && amount.error} 
    @@ -216,22 +229,22 @@ class BlocktradesDeposit extends React.Component {
    - Deposit using {selectInputCoin} + {translate('deposit_using') + ' '} {selectInputCoin}
    {sendTo} {paymentLink && !hasError &&  } -
    {depositLimit && `Suggested limit ${depositLimit}`} 
    +
    {depositLimit && translate('suggested_limit', {depositLimit})} 

    {inputAddress && trRows &&
    -

    Transaction History

    - {trRows.length ? trRows :
    Nothing yet…
    } +

    {translate("transaction_history")}

    + {trRows.length ? trRows :
    {translate("nothing_yet")}…
    }
    }
    @@ -242,7 +255,7 @@ class BlocktradesDeposit extends React.Component { - {onClose && } + {onClose && }
    @@ -250,7 +263,7 @@ class BlocktradesDeposit extends React.Component {
    - Powered by Blocktrades + {translate('powered_by') + ' '}Blocktrades
    @@ -269,7 +282,7 @@ export default reduxForm( }, (state, ownProps) => { // static defaultProps were not available, set them here instead - let {inputCoinType = 'BTC', outputCoinType = 'VESTS'} = ownProps + let {inputCoinType = 'BTC', outputCoinType = VEST_TICKER} = ownProps if(state.form.blocktradesDeposit) { const blocktradesDepositForm = state.form.blocktradesDeposit if(blocktradesDepositForm.inputCoin.value) @@ -305,12 +318,12 @@ export default reduxForm( const error = tradeError.toJS() userTradeError = error.message console.error('Blocktrades API Error', error) - const prefix = 'Internal Server Error: ' + const prefix = translate('internal_server_error') + ': ' if (userTradeError.startsWith(prefix)) userTradeError = userTradeError.substr(prefix.length); } const validate = values => ({ - amount: !/[0-9\.]/.test(values.amount) ? 'Enter Amount' : null + amount: !/[0-9\.]/.test(values.amount) ? translate('enter_amount') : null }) // 'defaults' is needed because the redux form `initialValues` are not available in the fields at mounting time return {...ownProps, initialValues, defaults: initialValues, validate, @@ -352,14 +365,14 @@ export default reduxForm( // ['transaction_seen' or 'transaction_fully_confirmed' or 'no_output_mapping' or 'permanent_output_failure_unauthorized_input_currency' or 'permanent_output_failure_unauthorized_output_currency' or 'permanent_output_failure_input_too_small' or 'output_wallet_unreachable' or 'insufficient_funds_in_hot_wallet' or 'output_transaction_initiated' or 'awaiting_order_fill' or 'unknown_error_sending_output' or 'output_transaction_broadcast' or 'output_transaction_fully_confirmed' or 'no_refund_address'] const statusNames = { - transaction_seen: 'Processing', - output_transaction_broadcast: 'Broadcasted', - output_transaction_fully_confirmed: 'Confirmed', + transaction_seen: translate('processing'), + output_transaction_broadcast: translate('broadcasted'), + output_transaction_fully_confirmed: translate('confirmed'), } const coalesce = (...values) => values.find(v => v != null) const coinName = (symbol, full = false) => - coalesce(coinNames[symbol] ? (full ? coinNames[symbol] + (symbol === 'VESTS' ? '' : ' (' + symbol + ')') : + coalesce(coinNames[symbol] ? (full ? coinNames[symbol] + (symbol === VEST_TICKER ? '' : ' (' + symbol + ')') : coinNames[symbol]) : null, symbol) const toSteem = value => coalesce(coalesce(coinToTypes.find(v => v[1] === value), [])[0], value) const toTrade = value => coalesce(coalesce(coinToTypes.find(v => v[0] === value), [])[1], value) @@ -369,6 +382,7 @@ const trHashLink = (coin, hash) => !hash ? null : coin === 'BTC' ? : /STEEM|VESTS|SBD/.test(coin) ? : + /GOLOS|GESTS|GBG/.test(coin) ? : hash.substring(0, 10) + '...' /** Memory backed local storage. Assumes this is the sole maintainer of this key. From c31be6d65b2a9c1a9406681e139a7a422408c268 Mon Sep 17 00:00:00 2001 From: Sigve Kvalsvik Date: Fri, 9 Dec 2016 11:49:44 -0500 Subject: [PATCH 44/61] Fix prop warnings, 'npm cache clean' required before 'npm i' (#773) * Fix prop warnings, 'npm cache clean' required before 'npm i' * Pull react-foundation-components from lib branch * react-foundation-componentss use commit instead of branch * update shrinkwrap --- npm-shrinkwrap.json | 39 +++++++++++++++++++++++++++++++++------ package.json | 3 +-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0a05f3434a..19d4e72111 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -4117,6 +4117,11 @@ "from": "minimist@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, + "mixpanel": { + "version": "0.5.0", + "from": "mixpanel@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.5.0.tgz" + }, "mkdirp": { "version": "0.5.1", "from": "mkdirp@>=0.5.1 <0.6.0", @@ -5092,9 +5097,26 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.3.2.tgz" }, "react-foundation-components": { - "version": "0.11.1", - "from": "git+https://github.com/valzav/react-foundation-components.git#lib", - "resolved": "git+https://github.com/valzav/react-foundation-components.git#3f7572ed791094104f79f04cf1ff359f53c54311" + "version": "0.12.0", + "from": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", + "resolved": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", + "dependencies": { + "foundation-sites": { + "version": "6.2.4", + "from": "foundation-sites@>=6.2.3 <7.0.0", + "resolved": "https://registry.npmjs.org/foundation-sites/-/foundation-sites-6.2.4.tgz" + }, + "lodash": { + "version": "4.17.2", + "from": "lodash@>=4.16.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + }, + "uncontrollable": { + "version": "4.0.3", + "from": "uncontrollable@>=4.0.3 <5.0.0", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.0.3.tgz" + } + } }, "react-highcharts": { "version": "8.4.2", @@ -5122,10 +5144,15 @@ "resolved": "https://registry.npmjs.org/react-notification/-/react-notification-5.0.7.tgz" }, "react-overlays": { - "version": "0.6.4", - "from": "react-overlays@0.6.4", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.6.4.tgz", + "version": "0.6.10", + "from": "react-overlays@>=0.6.3 <0.7.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.6.10.tgz", "dependencies": { + "react-prop-types": { + "version": "0.4.0", + "from": "react-prop-types@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz" + }, "warning": { "version": "3.0.0", "from": "warning@>=3.0.0 <4.0.0", diff --git a/package.json b/package.json index f8cc32a34f..82fbc61a82 100644 --- a/package.json +++ b/package.json @@ -88,12 +88,11 @@ "react-addons-pure-render-mixin": "^15.3.2", "react-addons-test-utils": "^15.3.2", "react-dom": "^15.3.2", - "react-foundation-components": "git+https://github.com/valzav/react-foundation-components.git#lib", + "react-foundation-components": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", "react-highcharts": "^8.3.3", "react-intl": "^2.1.3", "react-medium-editor": "^1.8.0", "react-notification": "^5.0.7", - "react-overlays": "0.6.4", "react-portal": "^2.2.1", "react-prop-types": "^0.3.0", "react-qr": "0.0.2", From 8c0f1cba21cff34a6077d33fbd57ec953f9129cf Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Fri, 9 Dec 2016 12:54:40 -0500 Subject: [PATCH 45/61] initial contributors.md, close #817 (#825) --- CONTRIBUTORS.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 CONTRIBUTORS.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000000..6db738a5df --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,18 @@ +This file contains a list of people who have made +large contributions to the Steemit.com codebase. + + + +(not complete) + + + +## Internationalization + - @hipster + - @ekitcho + - @heimindanger + - @fernando-sanz + - @jza + - @cheftony + - @jumpeiyamane + * Japanese From 611370f980e300c08eab538063a39fbfe3a8ad94 Mon Sep 17 00:00:00 2001 From: Valentine Zavgorodnev Date: Fri, 9 Dec 2016 15:01:15 -0500 Subject: [PATCH 46/61] 518 secure server session (#823) * Adds authentication proof for server. (close #518) * Rename fromm koa-crypto-session to crypto-session * some more merging updates.. * make sure logged in account is used in notifications * remove config.login_challenge_description * depricate login_challenge call; don't call login_account if already logged in * Sign login challenge with posting key only (active commented out). #518 * remove active verification from session.auth (probably temp) * Fix challenge string sigining. * remove some debug output * remove some commented out code * remove session.auth, use session.login_challenge instead, pass login_challenge as single token * Small login challenge data-structure fix. * Notifications api warning if not logged in. * Notifications api warning if not logged in. * Adjust notification api warning if not logged in * should make it call /login_account even if page wasn't refreshed after logout * small code rearrangment --- README.md | 8 +++++++ app/redux/Offchain.jsx | 15 +++++++------ app/redux/RootReducer.js | 2 +- app/redux/UserSaga.js | 27 +++++++++++++++++++---- app/utils/ServerApiClient.js | 5 +++-- config/steem-example.json | 1 + package.json | 1 + server/api/general.js | 42 ++++++++++++++++++++++++++++++++---- server/api/notifications.js | 17 +++++++++++---- server/app_render.jsx | 9 +++++++- server/server.js | 6 ++++-- 11 files changed, 108 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index a0ba5a3c8f..dff7c8d80a 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,19 @@ npm install -g babel-cli #### Create config file + ```bash cd config cp steem-example.json steem-dev.json ``` +Generate a new crypto_key and save under server_session_secret in ./steem-dev.json. + +```bash +node +> crypto.randomBytes(32).toString('base64') +``` + (note: it's steem.json in production) #### Install mysql server diff --git a/app/redux/Offchain.jsx b/app/redux/Offchain.jsx index c4a5cb8fbd..08fa018f22 100644 --- a/app/redux/Offchain.jsx +++ b/app/redux/Offchain.jsx @@ -1,12 +1,13 @@ import Immutable from 'immutable'; -import createModule from 'redux-modules'; import {PropTypes} from 'react'; -const {string, object, shape, oneOf} = PropTypes; const defaultState = Immutable.fromJS({user: {}}); -export default createModule({ - name: 'offchain', - initialState: defaultState, - transformations: [] -}); +export default function reducer(state = defaultState, action) { + if (action.type === 'user/SAVE_LOGIN_CONFIRM') { + if (!action.payload) { + state = state.set('account', null); + } + } + return state; +} diff --git a/app/redux/RootReducer.js b/app/redux/RootReducer.js index 80068c8edf..b4d56ddb0c 100644 --- a/app/redux/RootReducer.js +++ b/app/redux/RootReducer.js @@ -45,7 +45,7 @@ function initReducer(reducer, type) { export default combineReducers({ global: initReducer(globalReducerModule.reducer, 'global'), market: initReducer(marketReducerModule.reducer), - offchain: initReducer(offchain.reducer), + offchain: initReducer(offchain), user: initReducer(user.reducer), // auth: initReducer(auth.reducer), transaction: initReducer(transaction.reducer), diff --git a/app/redux/UserSaga.js b/app/redux/UserSaga.js index 1a8db68e55..eabcdecb3a 100644 --- a/app/redux/UserSaga.js +++ b/app/redux/UserSaga.js @@ -2,7 +2,7 @@ import {fromJS, Set, List} from 'immutable' import {takeLatest} from 'redux-saga'; import {call, put, select, fork} from 'redux-saga/effects'; import {accountAuthLookup} from 'app/redux/AuthSaga' -import {PrivateKey} from 'shared/ecc' +import {PrivateKey, Signature, hash} from 'shared/ecc' import user from 'app/redux/User' import {getAccount} from 'app/redux/SagaShared' import {browserHistory} from 'react-router' @@ -246,7 +246,28 @@ function* usernamePasswordLogin2({payload: {username, password, saveLogin, if (!autopost && saveLogin) yield put(user.actions.saveLogin()); - serverApiLogin(username); + try { + // const challengeString = yield serverApiLoginChallenge() + const offchainData = yield select(state => state.offchain) + const serverAccount = offchainData.get('account') + const challengeString = offchainData.get('login_challenge') + if (!serverAccount && challengeString) { + const signatures = {} + const challenge = {token: challengeString} + const bufSha = hash.sha256(JSON.stringify(challenge, null, 0)) + const sign = (role, d) => { + if (!d) return + const sig = Signature.signBufferSha256(bufSha, d) + signatures[role] = sig.toHex() + } + sign('posting', private_keys.get('posting_private')) + // sign('active', private_keys.get('active_private')) + serverApiLogin(username, signatures); + } + } catch(error) { + // Does not need to be fatal + console.error('Server Login Error', error); + } if (afterLoginRedirectToWelcome) browserHistory.push('/welcome'); } @@ -347,8 +368,6 @@ function* lookupPreviousOwnerAuthority({payload: {}}) { yield put(user.actions.setUser({previous_owner_authority})) } -import {Signature, hash} from 'shared/ecc' - function* uploadImageWatch() { yield* takeLatest('user/UPLOAD_IMAGE', uploadImage); } diff --git a/app/utils/ServerApiClient.js b/app/utils/ServerApiClient.js index 00bcce46ba..2e97749250 100644 --- a/app/utils/ServerApiClient.js +++ b/app/utils/ServerApiClient.js @@ -10,9 +10,9 @@ const request_base = { } }; -export function serverApiLogin(account) { +export function serverApiLogin(account, signatures) { if (!process.env.BROWSER || window.$STM_ServerBusy) return; - const request = Object.assign({}, request_base, {body: JSON.stringify({csrf: $STM_csrf, account})}); + const request = Object.assign({}, request_base, {body: JSON.stringify({account, signatures, csrf: $STM_csrf})}); fetch('/api/v1/login_account', request); } @@ -69,3 +69,4 @@ if (process.env.BROWSER) { window.getNotifications = getNotifications; window.markNotificationRead = markNotificationRead; } + diff --git a/config/steem-example.json b/config/steem-example.json index a43b7eddfe..927142c5d2 100644 --- a/config/steem-example.json +++ b/config/steem-example.json @@ -31,6 +31,7 @@ ] } }, + "server_session_secret": "", "helmet": {}, "registrar": { "account": "-", diff --git a/package.json b/package.json index 82fbc61a82..2e4bf76370 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "koa-route": "^2.4.2", "koa-router": "^5.4.0", "koa-session": "^3.3.1", + "@steem/crypto-session": "git+https://github.com/steemit/crypto-session.git", "koa-static-cache": "^3.1.2", "lodash.debounce": "^4.0.7", "medium-editor-insert-plugin": "^2.3.2", diff --git a/server/api/general.js b/server/api/general.js index 6baf973465..7c37eda49c 100644 --- a/server/api/general.js +++ b/server/api/general.js @@ -7,12 +7,13 @@ import recordWebEvent from 'server/record_web_event'; import {esc, escAttrs} from 'db/models'; import {emailRegex, getRemoteIp, rateLimitReq, checkCSRF} from 'server/utils'; import coBody from 'co-body'; +import secureRandom from 'secure-random' +import {PublicKey, Signature, hash} from 'shared/ecc' import Mixpanel from 'mixpanel'; import Tarantool from 'db/tarantool'; const mixpanel = config.mixpanel ? Mixpanel.init(config.mixpanel) : null; - export default function useGeneralApi(app) { const router = koa_router({prefix: '/api/v1'}); app.use(router.routes()); @@ -194,20 +195,51 @@ export default function useGeneralApi(app) { router.post('/login_account', koaBody, function *() { if (rateLimitReq(this, this.req)) return; const params = this.request.body; - const {csrf, account} = typeof(params) === 'string' ? JSON.parse(params) : params; + const {csrf, account, signatures} = typeof(params) === 'string' ? JSON.parse(params) : params; if (!checkCSRF(this, csrf)) return; console.log('-- /login_account -->', this.session.uid, account); try { - this.session.a = account; const db_account = yield models.Account.findOne( {attributes: ['user_id'], where: {name: esc(account)}, logging: false} ); if (db_account) this.session.user = db_account.user_id; + + if(signatures) { + if(!this.session.login_challenge) { + console.error('/login_account missing this.session.login_challenge'); + } else { + const [chainAccount] = yield Apis.db_api('get_accounts', [account]) + if(!chainAccount) { + console.error('/login_account missing blockchain account', account); + } else { + const auth = {posting: false} + const bufSha = hash.sha256(JSON.stringify({token: this.session.login_challenge}, null, 0)) + const verify = (type, sigHex, pubkey, weight, weight_threshold) => { + if(!sigHex) return + if(weight !== 1 || weight_threshold !== 1) { + console.error(`/login_account login_challenge unsupported ${type} auth configuration: ${account}`); + } else { + const sig = parseSig(sigHex) + const public_key = PublicKey.fromString(pubkey) + const verified = sig.verifyHash(bufSha, public_key) + if (!verified) { + console.error('/login_account verification failed', this.session.uid, account, pubkey) + } + auth[type] = verified + } + } + const {posting: {key_auths: [[posting_pubkey, weight]], weight_threshold}} = chainAccount + verify('posting', signatures.posting, posting_pubkey, weight, weight_threshold) + if (auth.posting) this.session.a = account; + } + } + } + this.body = JSON.stringify({status: 'ok'}); const remote_ip = getRemoteIp(this.req); if (mixpanel) { mixpanel.people.set(this.session.uid, {ip: remote_ip, $ip: remote_ip}); - mixpanel.people.increment(this.session.uid, 'Visits', 1); + mixpanel.people.increment(this.session.uid, 'Logins', 1); } } catch (error) { console.error('Error in /login_account api call', this.session.uid, error.message); @@ -348,3 +380,5 @@ function* createAccount({ Apis.broadcastTransaction(sx, () => {resolve()}).catch(e => {reject(e)}) ) } + +const parseSig = hexSig => {try {return Signature.fromHex(hexSig)} catch(e) {return null}} diff --git a/server/api/notifications.js b/server/api/notifications.js index 6a8bc3e6d3..8657028250 100644 --- a/server/api/notifications.js +++ b/server/api/notifications.js @@ -14,8 +14,11 @@ export default function useNotificationsApi(app) { // get all notifications for account router.get('/notifications/:account', function *() { const account = this.params.account; - // TODO: make sure account name matches session - console.log('-- GET /notifications/:account -->', account); + console.log('-- GET /notifications/:account -->', account, status(this, account)); + + if (!account || account !== this.session.a) { + this.body = []; return; + } try { const res = yield Tarantool.instance().select('notifications', 0, 1, 0, 'eq', account); this.body = toResArray(res); @@ -29,10 +32,11 @@ export default function useNotificationsApi(app) { // mark account's notification as read router.put('/notifications/:account/:ids', function *() { const {account, ids} = this.params; - if (!ids) { + console.log('-- PUT /notifications/:account/:id -->', account, status(this, account)); + + if (!ids || !account || account !== this.session.a) { this.body = []; return; } - console.log('-- PUT /notifications/:account/:id -->', account, ids); const fields = ids.split('-'); try { let res; @@ -47,3 +51,8 @@ export default function useNotificationsApi(app) { return; }); } + +const status = (ctx, account) => + ctx.session.a == null ? 'not logged in' : + account !== ctx.session.a ? 'wrong account' + ctx.session.a : + '' \ No newline at end of file diff --git a/server/app_render.jsx b/server/app_render.jsx index 82e382bfb6..979e4640e1 100644 --- a/server/app_render.jsx +++ b/server/app_render.jsx @@ -3,18 +3,25 @@ import { renderToString } from 'react-dom/server'; import ServerHTML from './server-html'; import universalRender from '../shared/UniversalRender'; import models from 'db/models'; +import secureRandom from 'secure-random' const DB_RECONNECT_TIMEOUT = process.env.NODE_ENV === 'development' ? 1000 * 60 * 60 : 1000 * 60 * 10; async function appRender(ctx) { const store = {}; try { + let login_challenge = ctx.session.login_challenge; + if (!login_challenge) { + login_challenge = secureRandom.randomBuffer(16).toString('hex'); + ctx.session.login_challenge = login_challenge; + } const offchain = { csrf: ctx.csrf, flash: ctx.flash, new_visit: ctx.session.new_visit, account: ctx.session.a, - config: $STM_Config + config: $STM_Config, + login_challenge }; const user_id = ctx.session.user; if (user_id) { diff --git a/server/server.js b/server/server.js index ef59a2e232..efc6829777 100644 --- a/server/server.js +++ b/server/server.js @@ -16,7 +16,7 @@ import useNotificationsApi from './api/notifications'; import useEnterAndConfirmEmailPages from './server_pages/enter_confirm_email'; import useEnterAndConfirmMobilePages from './server_pages/enter_confirm_mobile'; import isBot from 'koa-isbot'; -import session from 'koa-session'; +import session from '@steem/crypto-session'; import csrf from 'koa-csrf'; import flash from 'koa-flash'; import minimist from 'minimist'; @@ -33,8 +33,10 @@ const env = process.env.NODE_ENV || 'development'; const cacheOpts = {maxAge: 86400000, gzip: true}; app.keys = [config.session_key]; -app.use(session({maxAge: 1000 * 3600 * 24 * 60}, app)); +const crypto_key = config.server_session_secret; +session(app, {maxAge: 1000 * 3600 * 24 * 60, crypto_key}); csrf(app); + app.use(mount(grant)); app.use(flash({key: 'flash'})); From 0455269967df2845136bd1f23a9c94c0585bbb3a Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Mon, 12 Dec 2016 10:10:43 -0500 Subject: [PATCH 47/61] translation of markets (#604) * inital translation of markets. needs testing * depth chart update * backport updates, remove localCurrency * remove localCurrency from DepthChart * orderbook tables * main market page * revert BlocktradesDeposit, moved to translate-blocktrades branch (#821) * remove comments, fix order_placed message * nicer string interp * add price warning xlations * change spaces to tabs * add cancelOrder xlations --- app/components/elements/DepthChart.jsx | 10 ++- app/components/elements/OrderHistory.jsx | 14 +-- app/components/elements/Orderbook.jsx | 14 +-- app/components/pages/Market.jsx | 104 ++++++++++++----------- app/locales/en.js | 4 + app/locales/es.js | 6 +- app/locales/es_AR.js | 6 +- app/locales/fr.js | 6 +- app/locales/it.js | 6 +- app/locales/jp.js | 6 +- app/locales/ru.js | 4 + app/utils/MarketClasses.js | 11 +-- 12 files changed, 115 insertions(+), 76 deletions(-) diff --git a/app/components/elements/DepthChart.jsx b/app/components/elements/DepthChart.jsx index a9e2f67e68..10870c3095 100644 --- a/app/components/elements/DepthChart.jsx +++ b/app/components/elements/DepthChart.jsx @@ -1,6 +1,8 @@ import React from 'react'; //import Highcharts from 'highcharts'; const ReactHighcharts = require("react-highcharts/dist/ReactHighstock"); +import { translate } from 'app/Translator'; +import { LIQUID_TOKEN_UPPERCASE, DEBT_TOKEN_SHORT, LIQUID_TICKER, CURRENCY_SIGN } from 'config/client_config'; //Highstock does not play well with decimal x values, so we need to // multiply the x values by a constant factor and divide by this factor for @@ -131,11 +133,11 @@ function generateDepthChart(bidsArray, asksArray) { if(process.env.BROWSER) { if(bids[0]) { - series.push({step: 'right', name: 'Bid', color: 'rgba(0,150,0,1.0)', fillColor: 'rgba(0,150,0,0.2)', tooltip: {valueSuffix: ' STEEM'}, + series.push({step: 'right', name: translate('bid'), color: 'rgba(0,150,0,1.0)', fillColor: 'rgba(0,150,0,0.2)', tooltip: {valueSuffix: ' ' + LIQUID_TICKER}, data: bids}) } if(asks[0]) { - series.push({step: 'left', name: 'Ask', color: 'rgba(150,0,0,1.0)', fillColor: 'rgba(150,0,0,0.2)', tooltip: {valueSuffix: ' STEEM'}, + series.push({step: 'left', name: translate('ask'), color: 'rgba(150,0,0,1.0)', fillColor: 'rgba(150,0,0,0.2)', tooltip: {valueSuffix: ' ' + LIQUID_TICKER}, data: asks}) } } @@ -163,7 +165,7 @@ function generateDepthChart(bidsArray, asksArray) { align: "left", formatter: function () { let value = this.value / precision; - return "$" + (value > 10e6 ? (value / 10e6).toFixed(2) + "M" : + return '$' + (value > 10e6 ? (value / 10e6).toFixed(2) + "M" : value > 10000 ? (value / 10e3).toFixed(2) + "k" : value); } @@ -190,7 +192,7 @@ function generateDepthChart(bidsArray, asksArray) { shared: false, backgroundColor: "rgba(0, 0, 0, 0.3)", formatter() { - return `Price: ${(this.x / power).toFixed(6)} $/STEEM
    \u25CF${this.series.name}: ${(this.y / 1000).toFixed(3)} SD ($)`; + return `${translate('price')}: ${(this.x / power).toFixed(6)} ${CURRENCY_SIGN}/${LIQUID_TOKEN_UPPERCASE}
    \u25CF${this.series.name}: ${(this.y / 1000).toFixed(3)} ${DEBT_TOKEN_SHORT} ` + '(' + CURRENCY_SIGN + ')'; }, style: { color: "#FFFFFF" diff --git a/app/components/elements/OrderHistory.jsx b/app/components/elements/OrderHistory.jsx index 60e19dba99..2df62ddcca 100644 --- a/app/components/elements/OrderHistory.jsx +++ b/app/components/elements/OrderHistory.jsx @@ -1,5 +1,7 @@ import React from "react"; import HistoryRow from "./OrderhistoryRow.jsx"; +import { translate } from 'app/Translator'; +import { DEBT_TOKEN_SHORT, LIQUID_TOKEN, CURRENCY_SIGN } from 'config/client_config'; export default class OrderHistory extends React.Component { @@ -67,10 +69,10 @@ export default class OrderHistory extends React.Component { - - - - + + + + @@ -82,12 +84,12 @@ export default class OrderHistory extends React.Component {
    • - +
    • = (history.length - 10) ? " disabled" : "")} onClick={this._setHistoryPage.bind(this, true)} aria-label="Next"> - +
    diff --git a/app/components/elements/Orderbook.jsx b/app/components/elements/Orderbook.jsx index a36a9aec8b..e0175c0643 100644 --- a/app/components/elements/Orderbook.jsx +++ b/app/components/elements/Orderbook.jsx @@ -1,5 +1,7 @@ import React from "react"; import OrderbookRow from "./OrderbookRow"; +import { translate } from 'app/Translator.js'; +import { LIQUID_TOKEN, DEBT_TOKEN_SHORT, CURRENCY_SIGN } from 'config/client_config'; export default class Orderbook extends React.Component { @@ -47,10 +49,10 @@ export default class Orderbook extends React.Component { return ( - - - - + + + + ); @@ -107,12 +109,12 @@ export default class Orderbook extends React.Component {
    • - +
    • = (orders.length - 10) ? " disabled" : "")} onClick={this._setBuySellPage.bind(this, true)} aria-label="Next"> - +
    diff --git a/app/components/pages/Market.jsx b/app/components/pages/Market.jsx index 075e8ee19e..ba85745a15 100644 --- a/app/components/pages/Market.jsx +++ b/app/components/pages/Market.jsx @@ -10,6 +10,8 @@ import Orderbook from "app/components/elements/Orderbook"; import OrderHistory from "app/components/elements/OrderHistory"; import {Order, TradeHistory} from "app/utils/MarketClasses"; import {roundUp, roundDown} from "app/utils/MarketUtils"; +import { translate } from 'app/Translator.js'; +import { LIQUID_TOKEN, LIQUID_TOKEN_UPPERCASE, DEBT_TOKEN_SHORT, CURRENCY_SIGN, LIQUID_TICKER, DEBT_TICKER } from 'config/client_config'; class Market extends React.Component { static propTypes = { @@ -79,7 +81,7 @@ class Market extends React.Component { const min_to_receive = parseFloat(ReactDOM.findDOMNode(this.refs.buySteem_amount).value) const price = (amount_to_sell / min_to_receive).toFixed(6) const {lowest_ask} = this.props.ticker; - placeOrder(user, amount_to_sell + " SBD", min_to_receive + " STEEM", "$" + price + "/STEEM", !!this.state.buy_price_warning, lowest_ask, (msg) => { + placeOrder(user, `${amount_to_sell} ${DEBT_TICKER}`,`${min_to_receive} ${LIQUID_TICKER}`, `${CURRENCY_SIGN}${price}/${LIQUID_TICKER}`, !!this.state.buy_price_warning, lowest_ask, (msg) => { this.props.notify(msg) this.props.reload(user) }) @@ -92,7 +94,7 @@ class Market extends React.Component { const amount_to_sell = parseFloat(ReactDOM.findDOMNode(this.refs.sellSteem_amount).value) const price = (min_to_receive / amount_to_sell).toFixed(6) const {highest_bid} = this.props.ticker; - placeOrder(user, amount_to_sell + " STEEM", min_to_receive + " SBD", "$" + price + "/STEEM", !!this.state.sell_price_warning, highest_bid, (msg) => { + placeOrder(user, `${amount_to_sell} ${LIQUID_TICKER}`, `${min_to_receive} ${DEBT_TICKER}`, `${CURRENCY_SIGN}${price}/${LIQUID_TICKER}`, !!this.state.sell_price_warning, highest_bid, (msg) => { this.props.notify(msg) this.props.reload(user) }) @@ -228,7 +230,7 @@ class Market extends React.Component { function normalizeOpenOrders(open_orders) { return open_orders.map( o => { - const type = o.sell_price.base.indexOf('STEEM') > 0 ? 'ask' : 'bid' + const type = o.sell_price.base.indexOf(LIQUID_TICKER) > 0 ? 'ask' : 'bid' //{orderid: o.orderid, // created: o.created, return {...o, @@ -245,22 +247,22 @@ class Market extends React.Component { const rows = open_orders && normalizeOpenOrders(open_orders).map( o => - - + + - - + + ) return
    DatePriceSteemSD ($){translate('date')}{translate('price')}{LIQUID_TOKEN}{`${DEBT_TOKEN_SHORT} (${CURRENCY_SIGN})`}
    {buy ? "Total SD ($)" : "Price"}{buy ? "SD ($)" : "Steem"}{buy ? "Steem" : "SD ($)"}{buy ? "Price" : "Total SD ($)"}{translate(buy ? "total_DEBT_TOKEN_SHORT_CURRENCY_SIGN" : "price")}{buy ? `${DEBT_TOKEN_SHORT} (${CURRENCY_SIGN})` : LIQUID_TOKEN}{buy ? LIQUID_TOKEN : `${DEBT_TOKEN_SHORT} (${CURRENCY_SIGN})`}{translate(buy ? "price" : "total_DEBT_TOKEN_SHORT_CURRENCY_SIGN")}
    {o.created.replace('T', ' ')}{o.type == 'ask' ? 'Sell' : 'Buy'}${o.price.toFixed(6)}{translate(o.type == 'ask' ? 'sell' : 'buy')}{CURRENCY_SIGN}{o.price.toFixed(6)} {o.steem}{o.sbd.replace('SBD', 'SD')} cancelOrderClick(e, o.orderid)}>Cancel{o.sbd.replace('SBD', DEBT_TOKEN_SHORT)} cancelOrderClick(e, o.orderid)}>{translate('cancel')}
    - - - - - - + + + + + + @@ -290,12 +292,12 @@ class Market extends React.Component {
      -
    • Last price ${ticker.latest.toFixed(6)} ({pct_change})
    • -
    • 24h volume ${ticker.sbd_volume.toFixed(2)}
    • -
    • Bid ${ticker.highest_bid.toFixed(6)}
    • -
    • Ask ${ticker.lowest_ask.toFixed(6)}
    • +
    • {translate('last_price')} {CURRENCY_SIGN}{ticker.latest.toFixed(6)} ({pct_change})
    • +
    • {translate('24h_volume')} {CURRENCY_SIGN}{ticker.sbd_volume.toFixed(2)}
    • +
    • {translate('bid')} {CURRENCY_SIGN}{ticker.highest_bid.toFixed(6)}
    • +
    • {translate('ask')} {CURRENCY_SIGN}{ticker.lowest_ask.toFixed(6)}
    • {ticker.highest_bid > 0 && -
    • Spread {(200 * (ticker.lowest_ask - ticker.highest_bid) / (ticker.highest_bid + ticker.lowest_ask)).toFixed(3)}%
    • } +
    • {translate('spread')} {(200 * (ticker.lowest_ask - ticker.highest_bid) / (ticker.highest_bid + ticker.lowest_ask)).toFixed(3)}%
    • } {/*
    • Feed price ${ticker.feed_price.toFixed(3)}
    • */}
    @@ -315,12 +317,12 @@ class Market extends React.Component {
    -

    BUY STEEM

    +

    {translate('buy_LIQUID_TOKEN')}

    - +
    @@ -331,14 +333,14 @@ class Market extends React.Component { if(amount >= 0 && price >= 0) this.refs.buySteem_total.value = roundUp(price * amount, 3) validateBuySteem() }} /> - SD/STEEM + {`${DEBT_TOKEN_SHORT}/${LIQUID_TOKEN}`}
    - +
    @@ -348,14 +350,14 @@ class Market extends React.Component { if(price >= 0 && amount >= 0) this.refs.buySteem_total.value = roundUp(price * amount, 3) validateBuySteem() }} /> - STEEM + {LIQUID_TOKEN}
    - +
    @@ -365,7 +367,7 @@ class Market extends React.Component { if(total >= 0 && price >= 0) this.refs.buySteem_amount.value = roundUp(total / price, 3) validateBuySteem() }} /> - SD ($) + {`${DEBT_TOKEN_SHORT} (${CURRENCY_SIGN})`}
    @@ -374,7 +376,7 @@ class Market extends React.Component {
    - + {account && }
    @@ -395,7 +397,7 @@ class Market extends React.Component { this.refs.buySteem_price.value = ticker.lowest_ask if(amount >= 0) this.refs.buySteem_total.value = roundUp(amount * price, 3).toFixed(3) validateBuySteem() - }}>Lowest ask: {ticker.lowest_ask.toFixed(6)} + }}>{translate('lowest_ask')}: {ticker.lowest_ask.toFixed(6)}
    @@ -405,12 +407,12 @@ class Market extends React.Component {
    -

    SELL STEEM

    +

    {translate('sell_LIQUID_TOKEN')}

    - +
    @@ -421,14 +423,14 @@ class Market extends React.Component { if(amount >= 0 && price >= 0) this.refs.sellSteem_total.value = roundDown(price * amount, 3) validateSellSteem() }} /> - SD/STEEM + {`${DEBT_TOKEN_SHORT}/${LIQUID_TOKEN}`}
    - +
    @@ -438,14 +440,14 @@ class Market extends React.Component { if(price >= 0 && amount >= 0) this.refs.sellSteem_total.value = roundDown(price * amount, 3) validateSellSteem() }} /> - STEEM + {LIQUID_TOKEN}
    - +
    @@ -455,7 +457,7 @@ class Market extends React.Component { if(price >= 0 && total >= 0) this.refs.sellSteem_amount.value = roundUp(total / price, 3) validateSellSteem() }} /> - SD ($) + {`${DEBT_TOKEN_SHORT} (${CURRENCY_SIGN})`}
    @@ -463,7 +465,7 @@ class Market extends React.Component {
    } + }}>{translate('highest_bid')}: {ticker.highest_bid.toFixed(6)}
    @@ -488,7 +490,7 @@ class Market extends React.Component {
    -

    Buy Orders

    +

    {translate('buy_orders')}

    -

    Sell Orders

    +

    {translate('sell_orders')}

    -

    Trade History

    +

    {translate('trade_history')}

    {trade_history_table(this.props.history)}
    @@ -518,7 +520,7 @@ class Market extends React.Component { {account &&
    -

    Open Orders

    +

    {translate('open_orders')}

    {open_orders_table(open_orders)}
    } @@ -555,8 +557,8 @@ module.exports = { dispatch({type: 'market/UPDATE_MARKET', payload: {username: username}}) }, cancelOrder: (owner, orderid, successCallback) => { - const confirm = `Cancel order #${orderid} from ${owner}?` - const successMessage = `Order #${orderid} cancelled.` + const confirm = translate('order_cancel_confirm', {order_id: orderid, user: owner}) + const successMessage = translate('order_cancelled', {order_id: orderid}) dispatch(transaction.actions.broadcastOperation({ type: 'limit_order_cancel', operation: {owner, orderid/*, __config: {successMessage}*/}, @@ -574,13 +576,15 @@ module.exports = { min_to_receive = min_to_receive.replace(min_to_receive.split(' ')[0], String(parseFloat(min_to_receive).toFixed(3))) - const isSell = /STEEM$/.test(amount_to_sell); - const confirmStr = isSell ? - `Sell ${amount_to_sell} for at least ${min_to_receive} (${effectivePrice})` : - `Buy at least ${min_to_receive} for ${amount_to_sell} (${effectivePrice})` - const successMessage = `Order placed: ${confirmStr}` + const isSell = amount_to_sell.indexOf(LIQUID_TICKER) > 0; + const confirmStr = translate(isSell + ? 'sell_amount_for_atleast' + : 'buy_atleast_amount_for', + {amount_to_sell, min_to_receive, effectivePrice} + ) + const successMessage = translate('order_placed') + ': ' + confirmStr const confirm = confirmStr + '?' - const warning = priceWarning ? "This price is well " + (isSell ? "below" : "above") + " the current market price of $" + parseFloat(marketPrice).toFixed(4) + "/STEEM, are you sure?" : null; + const warning = priceWarning ? translate('price_warning_'+(isSell ? "below" : "above"), {marketPrice: CURRENCY_SIGN + parseFloat(marketPrice).toFixed(4) + "/" + LIQUID_TOKEN_UPPERCASE}) : null; const orderid = Math.floor(Date.now() / 1000) dispatch(transaction.actions.broadcastOperation({ type: 'limit_order_create', diff --git a/app/locales/en.js b/app/locales/en.js index 495b6d123a..81303b32e6 100644 --- a/app/locales/en.js +++ b/app/locales/en.js @@ -243,6 +243,10 @@ const en = { open_orders: 'Open Orders', sell_amount_for_atleast: 'Sell {amount_to_sell} for at least {min_to_receive} ({effectivePrice})', buy_atleast_amount_for: 'Buy at least {min_to_receive} for {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', + order_cancel_confirm: 'Cancel order {order_id} from {user}?', + order_cancelled: 'Order {order_id} cancelled.', higher: 'Higher', // context is about prices lower: 'Lower', // context is about prices total_DEBT_TOKEN_SHORT_CURRENCY_SIGN: "Total " + DEBT_TOKEN_SHORT + ' (' + CURRENCY_SIGN + ')', diff --git a/app/locales/es.js b/app/locales/es.js index c3225e9897..923402e2b2 100644 --- a/app/locales/es.js +++ b/app/locales/es.js @@ -10,7 +10,7 @@ const es = { stolen_account_recovery: "Recuperación de Cuentas Robadas", change_account_password: "Cambiar Contraseña", steemit_chat: "Chat de Steemit", - steemit_api_docs: "Steemit API Docs", + steemit_api_docs: "Steemit API Docs", witnesses: "Testigos", vote_for_witnesses: "Votar por Testigos", privacy_policy: "Política de Privacidad", @@ -223,6 +223,10 @@ const es = { open_orders: 'Ordenes abiertas', sell_amount_for_atleast: 'Sell {amount_to_sell} for at least {min_to_receive} ({effectivePrice})', buy_atleast_amount_for: 'Buy at least {min_to_receive} for {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', //FIXME + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', //FIXME + order_cancel_confirm: 'Cancel order {order_id} from {user}?', //FIXME + order_cancelled: 'Order {order_id} cancelled.', //FIXME higher: 'Más alto', // context is about prices lower: 'Más bajo', // context is about prices total_sd_dollars: "Total SD ($)", diff --git a/app/locales/es_AR.js b/app/locales/es_AR.js index ecea33cb78..e765cace64 100644 --- a/app/locales/es_AR.js +++ b/app/locales/es_AR.js @@ -10,7 +10,7 @@ const es_AR = { stolen_account_recovery: "Recuperación de Cuentas Robadas", change_account_password: "Cambiar Contraseña", steemit_chat: "Chat de Steemit", - steemit_api_docs: "Steemit API Docs", + steemit_api_docs: "Steemit API Docs", witnesses: "Testigos", vote_for_witnesses: "Votar por Testigos", privacy_policy: "Política de Privacidad", @@ -223,6 +223,10 @@ const es_AR = { open_orders: 'Ordenes abiertas', sell_amount_for_atleast: 'Sell {amount_to_sell} for at least {min_to_receive} ({effectivePrice})', buy_atleast_amount_for: 'Buy at least {min_to_receive} for {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', //FIXME + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', //FIXME + order_cancel_confirm: 'Cancel order {order_id} from {user}?', //FIXME + order_cancelled: 'Order {order_id} cancelled.', //FIXME higher: 'Más alto', // context is about prices lower: 'Más bajo', // context is about prices total_sd_dollars: "Total SD ($)", diff --git a/app/locales/fr.js b/app/locales/fr.js index 0277b27854..97875c170c 100644 --- a/app/locales/fr.js +++ b/app/locales/fr.js @@ -10,7 +10,7 @@ const fr = { stolen_account_recovery: "Récuperation de compte volé", change_account_password: "Changer mot de passe du compte", steemit_chat: "Steemit Chat", - steemit_api_docs: "Steemit API Docs", + steemit_api_docs: "Steemit API Docs", witnesses: "Témoins", vote_for_witnesses: "Votez pour les Témoins", privacy_policy: "Politique de Confidentialité", @@ -223,6 +223,10 @@ const fr = { open_orders: 'Open Orders', sell_amount_for_atleast: 'Sell {amount_to_sell} for at least {min_to_receive} ({effectivePrice})', buy_atleast_amount_for: 'Buy at least {min_to_receive} for {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', //FIXME + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', //FIXME + order_cancel_confirm: 'Cancel order {order_id} from {user}?', //FIXME + order_cancelled: 'Order {order_id} cancelled.', //FIXME higher: 'Higher', // context is about prices lower: 'Lower', // context is about prices total_sd_dollars: "Total SD ($)", diff --git a/app/locales/it.js b/app/locales/it.js index 705093cfff..0ea98e1110 100644 --- a/app/locales/it.js +++ b/app/locales/it.js @@ -10,7 +10,7 @@ const it = { stolen_account_recovery: "Recupera Account Perso", change_account_password: "Modifica Password Account", steemit_chat: "Steemit Chat", - steemit_api_docs: "Steemit API Docs", + steemit_api_docs: "Steemit API Docs", witnesses: "Testimoni", vote_for_witnesses: "Vota per Testimoni", privacy_policy: "Privacy Policy", @@ -223,6 +223,10 @@ const it = { open_orders: 'Open Orders', sell_amount_for_atleast: 'Vendi {amount_to_sell} per almeno {min_to_receive} ({effectivePrice})', buy_atleast_amount_for: 'Buy at least {min_to_receive} for {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', //FIXME + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', //FIXME + order_cancel_confirm: 'Cancel order {order_id} from {user}?', //FIXME + order_cancelled: 'Order {order_id} cancelled.', //FIXME higher: 'Higher', // context is about prices lower: 'Lower', // context is about prices total_sd_dollars: "Total SD ($)", diff --git a/app/locales/jp.js b/app/locales/jp.js index ba3f70def0..2546dc4013 100644 --- a/app/locales/jp.js +++ b/app/locales/jp.js @@ -10,7 +10,7 @@ const jp = { stolen_account_recovery: "盗まれたアカウントの復旧", change_account_password: "パスワードの変更", steemit_chat: "Steemitでチャット", - steemit_api_docs: "Steemit API Docs", + steemit_api_docs: "Steemit API Docs", witnesses: "Witnesses", vote_for_witnesses: "Vote for Witnesses", privacy_policy: "プライバシーポリシー", @@ -223,6 +223,10 @@ const jp = { open_orders: '見計らい注文', sell_amount_for_atleast: 'Sell {amount_to_sell} for at least {min_to_receive} ({effectivePrice})', buy_atleast_amount_for: 'Buy at least {min_to_receive} for {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', //FIXME + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', //FIXME + order_cancel_confirm: 'Cancel order {order_id} from {user}?', //FIXME + order_cancelled: 'Order {order_id} cancelled.', //FIXME higher: 'Higher', // context is about prices lower: 'Lower', // context is about prices total_sd_dollars: "Total SD ($)", diff --git a/app/locales/ru.js b/app/locales/ru.js index 30d567e1b9..23449da5ba 100644 --- a/app/locales/ru.js +++ b/app/locales/ru.js @@ -245,6 +245,10 @@ const ru = { open_orders: 'Открытые сделки', sell_amount_for_atleast: 'Продать {amount_to_sell} за {min_to_receive} по цене ({effectivePrice})', buy_atleast_amount_for: 'Купить {min_to_receive} за {amount_to_sell} ({effectivePrice})', + price_warning_above: 'This price is well above the current market price of {marketPrice}, are you sure?', //FIXME + price_warning_below: 'This price is well below the current market price of {marketPrice}, are you sure?', //FIXME + order_cancel_confirm: 'Cancel order {order_id} from {user}?', //FIXME + order_cancelled: 'Order {order_id} cancelled.', //FIXME higher: 'Дороже', // context is about prices lower: 'Дешевле', // context is about prices total_DEBT_TOKEN_SHORT_CURRENCY_SIGN: "Сумма " + DEBT_TOKEN_SHORT + ' (' + CURRENCY_SIGN + ')', diff --git a/app/utils/MarketClasses.js b/app/utils/MarketClasses.js index 2cc3a9b3a9..ca4ec6325b 100644 --- a/app/utils/MarketClasses.js +++ b/app/utils/MarketClasses.js @@ -1,4 +1,5 @@ import {roundDown, roundUp} from "./MarketUtils"; +import { LIQUID_TICKER, DEBT_TICKER } from 'config/client_config' const precision = 1000; class Order { @@ -63,14 +64,14 @@ class TradeHistory { zdate = zdate + 'Z' this.date = new Date(zdate); - this.type = fill.current_pays.indexOf("SBD") !== -1 ? "bid" : "ask"; + this.type = fill.current_pays.indexOf(DEBT_TICKER) !== -1 ? "bid" : "ask"; this.color = this.type == "bid" ? "buy-color" : "sell-color"; if (this.type === "bid") { - this.sbd = parseFloat(fill.current_pays.split(" SBD")[0]); - this.steem = parseFloat(fill.open_pays.split(" STEEM")[0]); + this.sbd = parseFloat(fill.current_pays.split(" " + DEBT_TICKER)[0]); + this.steem = parseFloat(fill.open_pays.split(" " + LIQUID_TICKER)[0]); } else { - this.sbd = parseFloat(fill.open_pays.split(" SBD")[0]); - this.steem = parseFloat(fill.current_pays.split(" STEEM")[0]); + this.sbd = parseFloat(fill.open_pays.split(" " + DEBT_TICKER)[0]); + this.steem = parseFloat(fill.current_pays.split(" " + LIQUID_TICKER)[0]); } this.price = this.sbd / this.steem; From 5e481b4d7245fe83f59e1b0fe507cfc416b0a095 Mon Sep 17 00:00:00 2001 From: James Calfee Date: Mon, 12 Dec 2016 09:19:18 -0600 Subject: [PATCH 48/61] Disable follow buttons while busy. close #830 --- app/components/elements/Follow.jsx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/app/components/elements/Follow.jsx b/app/components/elements/Follow.jsx index 3a980bf97c..a52875e317 100644 --- a/app/components/elements/Follow.jsx +++ b/app/components/elements/Follow.jsx @@ -27,6 +27,7 @@ export default class Follow extends React.Component { constructor(props) { super() + this.state = {} this.initEvents(props) this.shouldComponentUpdate = shouldComponentUpdate(this, 'Follow') } @@ -37,10 +38,15 @@ export default class Follow extends React.Component { initEvents(props) { const {updateFollow, follower, following} = props - this.follow = () => {updateFollow(follower, following, 'blog')} - this.unfollow = () => {updateFollow(follower, following)} - this.ignore = () => {updateFollow(follower, following, 'ignore')} - this.unignore = () => {updateFollow(follower, following)} + const upd = type => { + this.setState({busy: true}) + const done = () => {this.setState({busy: false})} + updateFollow(follower, following, type, done) + } + this.follow = () => {upd('blog')} + this.unfollow = () => {upd()} + this.ignore = () => {upd('ignore')} + this.unignore = () => {upd()} } render() { @@ -57,9 +63,11 @@ export default class Follow extends React.Component { const {followingWhat} = this.props // redux const {showFollow, showMute, fat, children} = this.props // html + const {busy} = this.state + const cnBusy = busy ? 'disabled' : '' const cnActive = 'button' + (fat ? '' : ' slim') - const cnInactive = cnActive + ' hollow secondary' + const cnInactive = cnActive + ' hollow secondary ' + cnBusy return {showFollow && followingWhat !== 'blog' && } @@ -105,7 +113,7 @@ module.exports = connect( }; }, dispatch => ({ - updateFollow: (follower, following, action) => { + updateFollow: (follower, following, action, done) => { const what = action ? [action] : [] const json = ['follow', {follower, following, what}] dispatch(transaction.actions.broadcastOperation({ @@ -115,6 +123,8 @@ module.exports = connect( required_posting_auths: [follower], json: JSON.stringify(json), }, + successCallback: done, + errorCallback: done, })) }, }) From d49778db0bbb699c393af5f66ad8d2c640c6679b Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 12 Dec 2016 11:26:10 -0500 Subject: [PATCH 49/61] abort dispatch if busy --- app/components/elements/Follow.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/components/elements/Follow.jsx b/app/components/elements/Follow.jsx index a52875e317..72ad0f370b 100644 --- a/app/components/elements/Follow.jsx +++ b/app/components/elements/Follow.jsx @@ -39,6 +39,7 @@ export default class Follow extends React.Component { initEvents(props) { const {updateFollow, follower, following} = props const upd = type => { + if(this.state.busy) return; this.setState({busy: true}) const done = () => {this.setState({busy: false})} updateFollow(follower, following, type, done) From 8e3b72bd08049b72556f6196795577e60018dac4 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 12 Dec 2016 12:19:50 -0500 Subject: [PATCH 50/61] always show comment collapser, close #810 --- app/components/cards/Comment.scss | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/components/cards/Comment.scss b/app/components/cards/Comment.scss index 9aad097677..4574d9d67f 100644 --- a/app/components/cards/Comment.scss +++ b/app/components/cards/Comment.scss @@ -72,11 +72,9 @@ } .Comment__header_collapse { - visibility: hidden; - //width: 1rem; float: right; > a { - color: $dark-gray; + color: $medium-gray; letter-spacing: 0.1rem; padding: 0 0.5rem; } @@ -85,7 +83,11 @@ } } -.Comment:hover .Comment__header .Comment__header_collapse { +.Comment > div > .Comment__header > .Comment__header_collapse > .Voting { + visibility: hidden; +} + +.Comment:hover > div > .Comment__header > .Comment__header_collapse > .Voting { visibility: visible; } From 8381cd43719c0e96286bb837e338fcf9715ab228 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 12 Dec 2016 12:30:35 -0500 Subject: [PATCH 51/61] allow votes dropdown to expand past post modal, close #762 --- app/components/cards/PostsList.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/cards/PostsList.scss b/app/components/cards/PostsList.scss index 3268504195..76d01ff53c 100644 --- a/app/components/cards/PostsList.scss +++ b/app/components/cards/PostsList.scss @@ -47,7 +47,6 @@ } .PostsList__post_container { - overflow: hidden; position: relative; background-color: $white; margin: 1rem auto; From 316d99adf2c6c5e9c266bbb8fe5cc352e6158f37 Mon Sep 17 00:00:00 2001 From: Valentine Zavgorodnev Date: Mon, 12 Dec 2016 14:58:15 -0500 Subject: [PATCH 52/61] Mixpanel update - track more events (#828) * track post event; track signup steps * add sign up step 3 tracking --- app/redux/TransactionSaga.js | 3 ++- server/server_pages/enter_confirm_email.jsx | 6 +++++- server/server_pages/enter_confirm_mobile.jsx | 10 +++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/redux/TransactionSaga.js b/app/redux/TransactionSaga.js index ba9a59128f..9cf73ea227 100644 --- a/app/redux/TransactionSaga.js +++ b/app/redux/TransactionSaga.js @@ -154,7 +154,8 @@ function* broadcastOperation({payload: } } yield call(broadcast, {payload}) - const eventType = type.replace(/^([a-z])/, g => g.toUpperCase()).replace(/_([a-z])/g, g => g[1].toUpperCase()); + let eventType = type.replace(/^([a-z])/, g => g.toUpperCase()).replace(/_([a-z])/g, g => g[1].toUpperCase()); + if (eventType === 'Comment' && !operation.parent_author) eventType = 'Post'; serverApiRecordEvent(eventType, '') } catch(error) { console.error('TransactionSage', error) diff --git a/server/server_pages/enter_confirm_email.jsx b/server/server_pages/enter_confirm_email.jsx index 82d3472586..57666cb8f8 100644 --- a/server/server_pages/enter_confirm_email.jsx +++ b/server/server_pages/enter_confirm_email.jsx @@ -10,7 +10,10 @@ import {checkCSRF, getRemoteIp} from '../utils'; import config from '../../config'; import SignupProgressBar from 'app/components/elements/SignupProgressBar'; import MiniHeader from 'app/components/modules/MiniHeader'; -import secureRandom from 'secure-random' +import secureRandom from 'secure-random'; +import Mixpanel from 'mixpanel'; + +const mixpanel = config.mixpanel ? Mixpanel.init(config.mixpanel) : null; const assets_file = process.env.NODE_ENV === 'production' ? 'tmp/webpack-stats-prod.json' : 'tmp/webpack-stats-dev.json'; const assets = Object.assign({}, require(assets_file), {script: []}); @@ -95,6 +98,7 @@ export default function useEnterAndConfirmEmailPages(app) {
    ); const props = {body, title: 'Email Address', assets, meta: []}; this.body = '' + renderToString(); + if (mixpanel) mixpanel.track('SignupStep1', {distinct_id: this.session.uid}); }); router.post('/submit_email', koaBody, function *() { diff --git a/server/server_pages/enter_confirm_mobile.jsx b/server/server_pages/enter_confirm_mobile.jsx index aee853b565..b7d9d55a64 100644 --- a/server/server_pages/enter_confirm_mobile.jsx +++ b/server/server_pages/enter_confirm_mobile.jsx @@ -9,7 +9,11 @@ import SignupProgressBar from 'app/components/elements/SignupProgressBar'; import CountryCode from 'app/components/elements/CountryCode'; import {getRemoteIp, checkCSRF} from 'server/utils'; import MiniHeader from 'app/components/modules/MiniHeader'; -import secureRandom from 'secure-random' +import secureRandom from 'secure-random'; +import config from '../../config'; +import Mixpanel from 'mixpanel'; + +const mixpanel = config.mixpanel ? Mixpanel.init(config.mixpanel) : null; const assets_file = process.env.NODE_ENV === 'production' ? 'tmp/webpack-stats-prod.json' : 'tmp/webpack-stats-dev.json'; const assets = Object.assign({}, require(assets_file), {script: []}); @@ -38,6 +42,7 @@ function *confirmMobileHandler() { return; } yield mid.update({verified: true}); + if (mixpanel) mixpanel.track('SignupStep3', {distinct_id: this.session.uid}); this.redirect('/create_account'); } export default function useEnterAndConfirmMobilePages(app) { @@ -55,6 +60,7 @@ export default function useEnterAndConfirmMobilePages(app) { ); if (mid && mid.verified) { this.flash = {success: 'Phone number has already been verified'}; + if (mixpanel) mixpanel.track('SignupStep3', {distinct_id: this.session.uid}); this.redirect('/create_account'); return; } @@ -92,6 +98,7 @@ export default function useEnterAndConfirmMobilePages(app) {
    ); const props = { body, title: 'Phone Number', assets, meta: [] }; this.body = '' + renderToString(); + if (mixpanel) mixpanel.track('SignupStep2', {distinct_id: this.session.uid}); }); router.post('/submit_mobile', koaBody, function *() { @@ -144,6 +151,7 @@ export default function useEnterAndConfirmMobilePages(app) { if (mid.verified) { if(mid.phone === phone) { this.flash = {success: 'Phone number has been verified'}; + if (mixpanel) mixpanel.track('SignupStep3', {distinct_id: this.session.uid}); this.redirect('/create_account'); return; } From 9c7bff41f9b3bdb07dfb78a74d35b1de6d75b340 Mon Sep 17 00:00:00 2001 From: valzav Date: Mon, 12 Dec 2016 15:12:11 -0500 Subject: [PATCH 53/61] fix phone verification issue that allowed to reuse phone number --- server/server_pages/enter_confirm_mobile.jsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/server/server_pages/enter_confirm_mobile.jsx b/server/server_pages/enter_confirm_mobile.jsx index aee853b565..e8452bf2ad 100644 --- a/server/server_pages/enter_confirm_mobile.jsx +++ b/server/server_pages/enter_confirm_mobile.jsx @@ -17,6 +17,23 @@ const assets = Object.assign({}, require(assets_file), {script: []}); function *confirmMobileHandler() { const confirmation_code = this.params && this.params.code ? this.params.code : this.request.body.code; console.log('-- /confirm_mobile -->', this.session.uid, this.session.user, confirmation_code); + + const phone = yield models.Identity.findOne( + {attributes: ['id', 'phone'], where: {confirmation_code, provider: 'phone'}} + ); + if (!phone) { + this.flash = {error: 'Wrong confirmation code.'}; + this.redirect('/enter_mobile'); + return; + } + const verified_phone = yield models.Identity.findOne( + {attributes: ['id'], where: {phone: phone.phone, provider: 'phone', verified: true}} + ); + if (verified_phone) { + this.flash = {success: 'Phone number has already been verified'}; + this.redirect('/create_account'); + return; + } const mid = yield models.Identity.findOne( {attributes: ['id', 'user_id', 'verified', 'updated_at'], where: {user_id: this.session.user, confirmation_code, provider: 'phone'}, order: 'id DESC'} ); From 69ecb9edf91321f613b0c562319bd27fa2a977e8 Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Mon, 12 Dec 2016 15:24:05 -0500 Subject: [PATCH 54/61] clarify power down error message, fix text matching, close #665 (#838) --- app/redux/Transaction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/redux/Transaction.js b/app/redux/Transaction.js index 34d8cfb972..69907d22ac 100644 --- a/app/redux/Transaction.js +++ b/app/redux/Transaction.js @@ -70,8 +70,8 @@ export default createModule({ } break case 'withdraw_vesting': - if(/Account registered by another account requires 10x account creation fee worth of Steem Power before it can power down/.test(errorStr)) - errorKey = 'Account registered by another account requires 10x account creation fee worth of Steem Power before it can power down' + if(/Account registered by another account requires 10x account creation fee worth of Steem Power/.test(errorStr)) + errorKey = 'Account requires 10x the account creation fee in Steem Power (approximately 300 SP) before it can power down.' break default: break From 45729013729c9dd55bce7ff79a5f32cc58eab21d Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Mon, 12 Dec 2016 15:28:08 -0500 Subject: [PATCH 55/61] add muted user list on Settings page. close #803 (#834) --- app/components/modules/Settings.jsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/components/modules/Settings.jsx b/app/components/modules/Settings.jsx index 9eb037a772..356e8c9602 100644 --- a/app/components/modules/Settings.jsx +++ b/app/components/modules/Settings.jsx @@ -9,6 +9,7 @@ import o2j from 'shared/clash/object2json' import LoadingIndicator from 'app/components/elements/LoadingIndicator' import Userpic from 'app/components/elements/Userpic'; import reactForm from 'app/utils/ReactForm' +import UserList from 'app/components/elements/UserList'; class Settings extends React.Component { @@ -110,6 +111,10 @@ class Settings extends React.Component { const {profile_image, name, about, location, website} = this.state + const {follow, account, isOwnAccount} = this.props + const following = follow && follow.getIn(['get_following', account.name]); + const ignores = isOwnAccount && following && following.get('ignore_result') + return
    {/*
    @@ -184,6 +189,13 @@ class Settings extends React.Component { }
    + {ignores && ignores.size > 0 && +
    +
    +

    + +
    +
    }
    } } @@ -203,6 +215,7 @@ export default connect( metaData, isOwnAccount: username == accountname, profile, + follow: state.global.get('follow'), ...ownProps } }, From ef7f13004b46533633a39603ae65af7f027b2afb Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Mon, 12 Dec 2016 15:53:38 -0500 Subject: [PATCH 56/61] release notes 0.1.161212 (#840) --- release-notes.txt | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/release-notes.txt b/release-notes.txt index ac2acd34ac..764154ce24 100644 --- a/release-notes.txt +++ b/release-notes.txt @@ -1,3 +1,48 @@ +--------------------------------------------------------------------- +0.1.161212 +--------------------------------------------------------------------- + + - ability to set witness proxy voter #797 + - add muted user list on Settings page #834 + - add zebra stripes to wallet page #818 + - allow votes dropdown to expand past post modal #836 + - always show comment collapser #835 + - fix phone verification issue #839 + - clarify power down error message #838 + - disable follow buttons while pending #832 + - translation of markets #604 + - mixpanel - track more events #828 + - add contributors.md #825 + - support for secure server sessions #823 + - fix post footer promo text #822 + - translation of blocktrades deposit #821 + - display pending conversions & add them to account value #804 + - fix follow counts #802 + - fix unknown account flashing #801 + - login/transfer updates, autofill username #798 + - prevent post footer wrapping #781 + + +--------------------------------------------------------------------- +0.1.161205 +--------------------------------------------------------------------- + + - proper inflection for vote count #794 + - update econ rules copy #793 + - remove high security key in overlay #791 + - @author/permlink redirect #786 + - normalize profile url #785 + - enforce display names not starting with `@` #780 + - show 'since date' for view counts on old posts #779 + - handle off screen click on resteem confirm #778 + - revert youtube previews to lower resolution #777 + - remove 0.15.0 compat layer, re-enable Promoted posts #776 + - refactor follow data structure #774 + - fix prop warnings - npm cleanup #773 + - fix potential firefox bug - not able to scroll a post #767 + - refactoring of market state #758 + + --------------------------------------------------------------------- 0.1.161202 --------------------------------------------------------------------- From 8753cae120961bfb714a955dfebfa2454491ad96 Mon Sep 17 00:00:00 2001 From: Valentine Zavgorodnev Date: Tue, 13 Dec 2016 12:06:26 -0500 Subject: [PATCH 57/61] phone is considered to be used only if there is account created with this phone (#841) --- server/server_pages/enter_confirm_mobile.jsx | 30 +++++++------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/server/server_pages/enter_confirm_mobile.jsx b/server/server_pages/enter_confirm_mobile.jsx index 6afa995b9e..62a1a0da60 100644 --- a/server/server_pages/enter_confirm_mobile.jsx +++ b/server/server_pages/enter_confirm_mobile.jsx @@ -22,24 +22,8 @@ function *confirmMobileHandler() { const confirmation_code = this.params && this.params.code ? this.params.code : this.request.body.code; console.log('-- /confirm_mobile -->', this.session.uid, this.session.user, confirmation_code); - const phone = yield models.Identity.findOne( - {attributes: ['id', 'phone'], where: {confirmation_code, provider: 'phone'}} - ); - if (!phone) { - this.flash = {error: 'Wrong confirmation code.'}; - this.redirect('/enter_mobile'); - return; - } - const verified_phone = yield models.Identity.findOne( - {attributes: ['id'], where: {phone: phone.phone, provider: 'phone', verified: true}} - ); - if (verified_phone) { - this.flash = {success: 'Phone number has already been verified'}; - this.redirect('/create_account'); - return; - } const mid = yield models.Identity.findOne( - {attributes: ['id', 'user_id', 'verified', 'updated_at'], where: {user_id: this.session.user, confirmation_code, provider: 'phone'}, order: 'id DESC'} + {attributes: ['id', 'user_id', 'verified', 'updated_at', 'phone'], where: {user_id: this.session.user, confirmation_code, provider: 'phone'}, order: 'id DESC'} ); if (!mid) { this.flash = {error: 'Wrong confirmation code.'}; @@ -51,11 +35,19 @@ function *confirmMobileHandler() { this.redirect('/create_account'); return; } - this.session.user = mid.user_id; + + const used_phone = yield models.sequelize.query(`SELECT a.id FROM accounts a JOIN identities i ON i.user_id=a.user_id WHERE i.phone='${mid.phone}'`, { type: models.Sequelize.QueryTypes.SELECT}) + if (used_phone && used_phone.length > 0) { + this.flash = {error: 'This phone number has already been used'}; + this.redirect('/enter_mobile'); + return; + } + const hours_ago = (Date.now() - mid.updated_at) / 1000.0 / 3600.0; if (hours_ago > 24.0) { this.status = 401; - this.body = 'Confirmation code has been expired'; + this.flash = {error: 'Confirmation code has been expired'}; + this.redirect('/enter_mobile'); return; } yield mid.update({verified: true}); From fd04cf233bbb8a4e5851e7f6ae8d5cfdecb2351c Mon Sep 17 00:00:00 2001 From: Tim Fesenko Date: Tue, 13 Dec 2016 17:51:44 -0500 Subject: [PATCH 58/61] update react & babel (#843) * update react and babel * update react addons & shrinkwrap * a couple of minor fixes --- .deployignore | 2 +- npm-shrinkwrap.json | 1629 +++++++++++++++++++++++++++++++--------- package.json | 28 +- server/server.js | 2 +- webpack/base.config.js | 1 - 5 files changed, 1292 insertions(+), 370 deletions(-) diff --git a/.deployignore b/.deployignore index 9401694736..d190b9ae52 100644 --- a/.deployignore +++ b/.deployignore @@ -4,5 +4,5 @@ coverage node_modules *.log vendor -config +config/*.json .git diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 19d4e72111..7a0dcf711e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2,6 +2,11 @@ "name": "Steemit.com", "version": "1.0.0", "dependencies": { + "@steem/crypto-session": { + "version": "1.0.3", + "from": "git+https://github.com/steemit/crypto-session.git", + "resolved": "git+https://github.com/steemit/crypto-session.git#5269244ae6bd077023b02ee9e093a524544bd607" + }, "abab": { "version": "1.0.3", "from": "abab@>=1.0.0 <2.0.0", @@ -40,14 +45,14 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" }, "ajv": { - "version": "4.9.0", + "version": "4.10.0", "from": "ajv@>=4.7.0 <5.0.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.9.0.tgz" + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.10.0.tgz" }, "ajv-keywords": { - "version": "1.1.1", + "version": "1.2.0", "from": "ajv-keywords@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.2.0.tgz" }, "align-text": { "version": "0.1.4", @@ -230,9 +235,119 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" }, "babel-cli": { - "version": "6.11.4", - "from": "babel-cli@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.11.4.tgz" + "version": "6.18.0", + "from": "babel-cli@6.18.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-core": { + "version": "6.20.0", + "from": "babel-core@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-generator": { + "version": "6.20.0", + "from": "babel-generator@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-helpers": { + "version": "6.16.0", + "from": "babel-helpers@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.16.0.tgz" + }, + "babel-register": { + "version": "6.18.0", + "from": "babel-register@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.18.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@>=6.11.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "detect-indent": { + "version": "4.0.0", + "from": "detect-indent@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@>=9.0.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "home-or-tmp": { + "version": "2.0.0", + "from": "home-or-tmp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" + }, + "jsesc": { + "version": "1.3.0", + "from": "jsesc@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + }, + "repeating": { + "version": "2.0.1", + "from": "repeating@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + }, + "source-map-support": { + "version": "0.4.6", + "from": "source-map-support@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.6.tgz" + } + } }, "babel-code-frame": { "version": "6.11.0", @@ -240,14 +355,49 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz" }, "babel-core": { - "version": "6.11.4", - "from": "babel-core@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.11.4.tgz", + "version": "6.20.0", + "from": "babel-core@6.20.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.20.0.tgz", "dependencies": { - "json5": { - "version": "0.4.0", - "from": "json5@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz" + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz" + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz" + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@>=6.11.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" } } }, @@ -257,29 +407,181 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-6.1.2.tgz" }, "babel-generator": { - "version": "6.11.4", - "from": "babel-generator@>=6.11.4 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.4.tgz" + "version": "6.20.0", + "from": "babel-generator@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz" + }, + "jsesc": { + "version": "1.3.0", + "from": "jsesc@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-bindify-decorators": { - "version": "6.8.0", - "from": "babel-helper-bindify-decorators@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-helper-bindify-decorators@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.8.0", + "version": "6.18.0", "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-builder-react-jsx": { - "version": "6.9.0", + "version": "6.18.0", "from": "babel-helper-builder-react-jsx@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.9.0.tgz" + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-call-delegate": { - "version": "6.8.0", - "from": "babel-helper-call-delegate@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-helper-call-delegate@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-define-map": { "version": "6.9.0", @@ -287,14 +589,106 @@ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.9.0.tgz" }, "babel-helper-explode-assignable-expression": { - "version": "6.8.0", - "from": "babel-helper-explode-assignable-expression@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-helper-explode-assignable-expression@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-explode-class": { - "version": "6.8.0", + "version": "6.18.0", "from": "babel-helper-explode-class@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-function-name": { "version": "6.8.0", @@ -307,39 +701,250 @@ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.8.0.tgz" }, "babel-helper-hoist-variables": { - "version": "6.8.0", - "from": "babel-helper-hoist-variables@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-helper-hoist-variables@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-optimise-call-expression": { - "version": "6.8.0", - "from": "babel-helper-optimise-call-expression@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-helper-optimise-call-expression@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-regex": { - "version": "6.9.0", + "version": "6.18.0", "from": "babel-helper-regex@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.9.0.tgz" + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-remap-async-to-generator": { - "version": "6.11.2", - "from": "babel-helper-remap-async-to-generator@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.11.2.tgz" + "version": "6.20.3", + "from": "babel-helper-remap-async-to-generator@>=6.16.2 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.20.3.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-helper-function-name": { + "version": "6.18.0", + "from": "babel-helper-function-name@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz" + }, + "babel-helper-get-function-arity": { + "version": "6.18.0", + "from": "babel-helper-get-function-arity@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz" + }, + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz" + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz" + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helper-replace-supers": { - "version": "6.8.0", - "from": "babel-helper-replace-supers@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-helper-replace-supers@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-helpers": { - "version": "6.8.0", - "from": "babel-helpers@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.8.0.tgz" + "version": "6.16.0", + "from": "babel-helpers@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.16.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@>=9.0.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-loader": { - "version": "6.2.4", - "from": "babel-loader@>=6.2.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.4.tgz" + "version": "6.2.9", + "from": "babel-loader@6.2.9", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.9.tgz" }, "babel-messages": { "version": "6.8.0", @@ -357,84 +962,179 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-2.2.0.tgz" }, "babel-plugin-syntax-async-functions": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-async-functions@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz" + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "from": "babel-plugin-syntax-async-generators@>=6.5.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz" }, "babel-plugin-syntax-class-constructor-call": { - "version": "6.8.0", - "from": "babel-plugin-syntax-class-constructor-call@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-plugin-syntax-class-constructor-call@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz" }, "babel-plugin-syntax-class-properties": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-class-properties@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz" }, "babel-plugin-syntax-decorators": { - "version": "6.8.0", - "from": "babel-plugin-syntax-decorators@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.8.0.tgz" + "version": "6.13.0", + "from": "babel-plugin-syntax-decorators@>=6.13.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz" }, "babel-plugin-syntax-do-expressions": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-do-expressions@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "from": "babel-plugin-syntax-dynamic-import@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz" }, "babel-plugin-syntax-exponentiation-operator": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-exponentiation-operator@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz" }, "babel-plugin-syntax-export-extensions": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-export-extensions@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz" }, "babel-plugin-syntax-flow": { - "version": "6.8.0", + "version": "6.18.0", "from": "babel-plugin-syntax-flow@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz" }, "babel-plugin-syntax-function-bind": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-function-bind@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz" }, "babel-plugin-syntax-jsx": { - "version": "6.8.0", + "version": "6.18.0", "from": "babel-plugin-syntax-jsx@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" }, "babel-plugin-syntax-object-rest-spread": { - "version": "6.8.0", + "version": "6.13.0", "from": "babel-plugin-syntax-object-rest-spread@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" }, "babel-plugin-syntax-trailing-function-commas": { - "version": "6.8.0", + "version": "6.20.0", "from": "babel-plugin-syntax-trailing-function-commas@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.20.0.tgz" + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.17.0", + "from": "babel-plugin-transform-async-generator-functions@>=6.17.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz" }, "babel-plugin-transform-async-to-generator": { - "version": "6.8.0", - "from": "babel-plugin-transform-async-to-generator@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.8.0.tgz" + "version": "6.16.0", + "from": "babel-plugin-transform-async-to-generator@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz" }, "babel-plugin-transform-class-constructor-call": { - "version": "6.8.0", + "version": "6.18.0", "from": "babel-plugin-transform-class-constructor-call@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.18.0.tgz" }, "babel-plugin-transform-class-properties": { - "version": "6.11.5", - "from": "babel-plugin-transform-class-properties@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.11.5.tgz" + "version": "6.19.0", + "from": "babel-plugin-transform-class-properties@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-helper-function-name": { + "version": "6.18.0", + "from": "babel-helper-function-name@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz" + }, + "babel-helper-get-function-arity": { + "version": "6.18.0", + "from": "babel-helper-get-function-arity@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@>=6.15.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@>=6.11.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@>=9.0.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-decorators": { - "version": "6.8.0", - "from": "babel-plugin-transform-decorators@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.8.0.tgz" + "version": "6.13.0", + "from": "babel-plugin-transform-decorators@>=6.13.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.13.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-do-expressions": { "version": "6.8.0", @@ -452,14 +1152,122 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz" }, "babel-plugin-transform-es2015-block-scoping": { - "version": "6.10.1", - "from": "babel-plugin-transform-es2015-block-scoping@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.10.1.tgz" + "version": "6.20.0", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.20.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@>=6.15.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz" + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@>=6.20.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz" + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@>=6.11.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@>=9.0.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-es2015-classes": { - "version": "6.9.0", - "from": "babel-plugin-transform-es2015-classes@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.9.0.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-classes@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-helper-define-map": { + "version": "6.18.0", + "from": "babel-helper-define-map@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz" + }, + "babel-helper-function-name": { + "version": "6.18.0", + "from": "babel-helper-function-name@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz" + }, + "babel-helper-get-function-arity": { + "version": "6.18.0", + "from": "babel-helper-get-function-arity@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.14.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.8.0", @@ -467,9 +1275,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz" }, "babel-plugin-transform-es2015-destructuring": { - "version": "6.9.0", - "from": "babel-plugin-transform-es2015-destructuring@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.9.0.tgz" + "version": "6.19.0", + "from": "babel-plugin-transform-es2015-destructuring@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz" }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.8.0", @@ -477,9 +1285,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz" }, "babel-plugin-transform-es2015-for-of": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-for-of@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-for-of@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz" }, "babel-plugin-transform-es2015-function-name": { "version": "6.9.0", @@ -491,10 +1299,127 @@ "from": "babel-plugin-transform-es2015-literals@>=6.3.13 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz" }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-modules-amd@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz" + }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.11.5", - "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.11.5.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.19.0", + "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.14.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-modules-umd@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz" }, "babel-plugin-transform-es2015-object-super": { "version": "6.8.0", @@ -502,14 +1427,89 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz" }, "babel-plugin-transform-es2015-parameters": { - "version": "6.11.4", - "from": "babel-plugin-transform-es2015-parameters@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.11.4.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-parameters@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz", + "dependencies": { + "babel-code-frame": { + "version": "6.20.0", + "from": "babel-code-frame@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + }, + "babel-helper-get-function-arity": { + "version": "6.18.0", + "from": "babel-helper-get-function-arity@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz" + }, + "babel-template": { + "version": "6.16.0", + "from": "babel-template@^6.16.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz" + }, + "babel-traverse": { + "version": "6.20.0", + "from": "babel-traverse@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "babylon": { + "version": "6.14.1", + "from": "babylon@^6.11.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + }, + "globals": { + "version": "9.14.0", + "from": "globals@^9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-es2015-spread": { "version": "6.8.0", @@ -527,9 +1527,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz" }, "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.8.0.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz" }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.11.0", @@ -547,9 +1547,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.8.0.tgz" }, "babel-plugin-transform-flow-strip-types": { - "version": "6.8.0", + "version": "6.18.0", "from": "babel-plugin-transform-flow-strip-types@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.8.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz" }, "babel-plugin-transform-function-bind": { "version": "6.8.0", @@ -557,9 +1557,21 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.8.0.tgz" }, "babel-plugin-transform-object-rest-spread": { - "version": "6.8.0", - "from": "babel-plugin-transform-object-rest-spread@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.8.0.tgz" + "version": "6.20.2", + "from": "babel-plugin-transform-object-rest-spread@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.20.2.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-plugin-transform-react-display-name": { "version": "6.8.0", @@ -582,59 +1594,90 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz" }, "babel-plugin-transform-regenerator": { - "version": "6.11.4", - "from": "babel-plugin-transform-regenerator@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.11.4.tgz" + "version": "6.20.0", + "from": "babel-plugin-transform-regenerator@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.20.0.tgz" }, "babel-plugin-transform-runtime": { - "version": "6.12.0", - "from": "babel-plugin-transform-runtime@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.12.0.tgz" + "version": "6.15.0", + "from": "babel-plugin-transform-runtime@6.15.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz" }, "babel-plugin-transform-strict-mode": { - "version": "6.11.3", - "from": "babel-plugin-transform-strict-mode@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.11.3.tgz" + "version": "6.18.0", + "from": "babel-plugin-transform-strict-mode@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz", + "dependencies": { + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + } + } + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-polyfill": { - "version": "6.9.1", - "from": "babel-polyfill@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.9.1.tgz" + "version": "6.20.0", + "from": "babel-polyfill@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.20.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.20.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } }, "babel-preset-es2015": { - "version": "6.9.0", - "from": "babel-preset-es2015@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.9.0.tgz" + "version": "6.18.0", + "from": "babel-preset-es2015@6.18.0", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz" }, "babel-preset-react": { - "version": "6.11.1", - "from": "babel-preset-react@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.11.1.tgz" + "version": "6.16.0", + "from": "babel-preset-react@6.16.0", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.16.0.tgz" }, "babel-preset-stage-0": { - "version": "6.5.0", - "from": "babel-preset-stage-0@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.5.0.tgz" + "version": "6.16.0", + "from": "babel-preset-stage-0@6.16.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.16.0.tgz" }, "babel-preset-stage-1": { - "version": "6.5.0", - "from": "babel-preset-stage-1@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.5.0.tgz" + "version": "6.16.0", + "from": "babel-preset-stage-1@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.16.0.tgz" }, "babel-preset-stage-2": { - "version": "6.11.0", - "from": "babel-preset-stage-2@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.11.0.tgz" + "version": "6.18.0", + "from": "babel-preset-stage-2@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz" }, "babel-preset-stage-3": { - "version": "6.11.0", - "from": "babel-preset-stage-3@>=6.11.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.11.0.tgz" + "version": "6.17.0", + "from": "babel-preset-stage-3@>=6.17.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz" }, "babel-register": { - "version": "6.11.6", - "from": "babel-register@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.11.6.tgz" + "version": "6.18.0", + "from": "babel-register@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.18.0.tgz" }, "babel-runtime": { "version": "6.11.6", @@ -706,16 +1749,6 @@ "from": "bignumber.js@2.3.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.3.0.tgz" }, - "bin-version": { - "version": "1.0.4", - "from": "bin-version@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz" - }, - "bin-version-check": { - "version": "2.1.0", - "from": "bin-version-check@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz" - }, "binary-extensions": { "version": "1.5.0", "from": "binary-extensions@>=1.0.0 <2.0.0", @@ -1043,6 +2076,11 @@ "from": "commander@>=2.8.1 <3.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" }, + "commondir": { + "version": "1.0.1", + "from": "commondir@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + }, "component-emitter": { "version": "1.2.1", "from": "component-emitter@>=1.2.0 <1.3.0", @@ -1355,9 +2393,9 @@ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz" }, "detect-indent": { - "version": "3.0.1", - "from": "detect-indent@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz" + "version": "4.0.0", + "from": "detect-indent@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" }, "diff": { "version": "1.4.0", @@ -1802,6 +2840,11 @@ "from": "finalhandler@0.4.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz" }, + "find-cache-dir": { + "version": "0.1.1", + "from": "find-cache-dir@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz" + }, "find-index": { "version": "0.1.1", "from": "find-index@>=0.1.1 <0.2.0", @@ -1819,11 +2862,6 @@ } } }, - "find-versions": { - "version": "1.2.1", - "from": "find-versions@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz" - }, "findup-sync": { "version": "0.4.2", "from": "findup-sync@>=0.4.0 <0.5.0", @@ -1932,9 +2970,9 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.28.0.tgz" }, "fs-readdir-recursive": { - "version": "0.1.2", - "from": "fs-readdir-recursive@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz" + "version": "1.0.0", + "from": "fs-readdir-recursive@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz" }, "fs.realpath": { "version": "1.0.0", @@ -2943,9 +3981,9 @@ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz" }, "home-or-tmp": { - "version": "1.0.0", - "from": "home-or-tmp@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz" + "version": "2.0.0", + "from": "home-or-tmp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" }, "hosted-git-info": { "version": "2.1.5", @@ -3681,6 +4719,16 @@ "from": "levn@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" }, + "libsodium": { + "version": "0.4.8", + "from": "libsodium@>=0.4.8 <0.5.0", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.4.8.tgz" + }, + "libsodium-wrappers": { + "version": "0.4.8", + "from": "libsodium-wrappers@>=0.4.8 <0.5.0", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.4.8.tgz" + }, "liftoff": { "version": "2.3.0", "from": "liftoff@>=2.1.0 <3.0.0", @@ -3975,11 +5023,6 @@ "from": "lodash.words@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz" }, - "log-symbols": { - "version": "1.0.2", - "from": "log-symbols@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz" - }, "lolex": { "version": "1.3.2", "from": "lolex@1.3.2", @@ -4218,112 +5261,6 @@ "from": "net@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz" }, - "newrelic": { - "version": "1.33.0", - "from": "newrelic@>=1.33.0 <2.0.0", - "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-1.33.0.tgz", - "dependencies": { - "agent-base": { - "version": "1.0.2", - "from": "agent-base@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz" - }, - "concat-stream": { - "version": "1.5.2", - "from": "concat-stream@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" - } - } - }, - "core-util-is": { - "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "debug": { - "version": "2.2.0", - "from": "debug@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" - }, - "extend": { - "version": "3.0.0", - "from": "extend@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" - }, - "https-proxy-agent": { - "version": "0.3.6", - "from": "https-proxy-agent@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz" - }, - "inherits": { - "version": "2.0.3", - "from": "inherits@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "process-nextick-args": { - "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" - }, - "readable-stream": { - "version": "1.1.14", - "from": "readable-stream@>=1.1.13 <2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - } - } - }, - "semver": { - "version": "5.3.0", - "from": "semver@>=5.3.0 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "typedarray": { - "version": "0.0.6", - "from": "typedarray@>=0.0.5 <0.1.0", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - }, - "util-deprecate": { - "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - }, - "yakaa": { - "version": "1.0.1", - "from": "yakaa@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/yakaa/-/yakaa-1.0.1.tgz" - } - } - }, "next-tick": { "version": "0.2.2", "from": "next-tick@>=0.2.2 <0.3.0", @@ -4461,9 +5398,9 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz" }, "object.entries": { - "version": "1.0.3", + "version": "1.0.4", "from": "object.entries@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz" }, "object.omit": { "version": "2.0.0", @@ -4471,9 +5408,9 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz" }, "object.values": { - "version": "1.0.3", + "version": "1.0.4", "from": "object.values@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz" }, "on-finished": { "version": "2.3.0", @@ -4604,11 +5541,6 @@ "from": "path-browserify@0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" }, - "path-exists": { - "version": "1.0.0", - "from": "path-exists@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz" - }, "path-is-absolute": { "version": "1.0.0", "from": "path-is-absolute@>=1.0.0 <2.0.0", @@ -4666,6 +5598,11 @@ "from": "pinkie-promise@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" }, + "pkg-dir": { + "version": "1.0.0", + "from": "pkg-dir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + }, "platform": { "version": "1.3.1", "from": "platform@1.3.1", @@ -5060,9 +5997,9 @@ "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz" }, "react": { - "version": "15.3.2", - "from": "react@15.3.2", - "resolved": "https://registry.npmjs.org/react/-/react-15.3.2.tgz", + "version": "15.4.1", + "from": "react@15.4.1", + "resolved": "https://registry.npmjs.org/react/-/react-15.4.1.tgz", "dependencies": { "core-js": { "version": "1.2.7", @@ -5070,21 +6007,16 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz" }, "fbjs": { - "version": "0.8.5", + "version": "0.8.6", "from": "fbjs@>=0.8.4 <0.9.0", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.5.tgz" + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.6.tgz" } } }, "react-addons-pure-render-mixin": { - "version": "15.3.2", - "from": "react-addons-pure-render-mixin@>=15.3.2 <16.0.0", - "resolved": "https://registry.npmjs.org/react-addons-pure-render-mixin/-/react-addons-pure-render-mixin-15.3.2.tgz" - }, - "react-addons-test-utils": { - "version": "15.3.2", - "from": "react-addons-test-utils@>=15.3.1 <16.0.0", - "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.3.2.tgz" + "version": "15.4.1", + "from": "react-addons-pure-render-mixin@>=15.4.1 <16.0.0", + "resolved": "https://registry.npmjs.org/react-addons-pure-render-mixin/-/react-addons-pure-render-mixin-15.4.1.tgz" }, "react-deep-force-update": { "version": "1.0.1", @@ -5092,9 +6024,9 @@ "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz" }, "react-dom": { - "version": "15.3.2", - "from": "react-dom@>=15.3.2 <16.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.3.2.tgz" + "version": "15.4.1", + "from": "react-dom@15.4.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.4.1.tgz" }, "react-foundation-components": { "version": "0.12.0", @@ -5324,6 +6256,28 @@ "from": "regenerator-runtime@>=0.9.5 <0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz" }, + "regenerator-transform": { + "version": "0.9.8", + "from": "regenerator-transform@0.9.8", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.8.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.20.0", + "from": "babel-runtime@^6.18.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + }, + "babel-types": { + "version": "6.20.0", + "from": "babel-types@^6.19.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz" + }, + "regenerator-runtime": { + "version": "0.10.1", + "from": "regenerator-runtime@^0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz" + } + } + }, "regex-cache": { "version": "0.4.3", "from": "regex-cache@>=0.4.2 <0.5.0", @@ -5377,9 +6331,9 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" }, "repeating": { - "version": "1.1.3", - "from": "repeating@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz" + "version": "2.0.1", + "from": "repeating@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" }, "replace-ext": { "version": "0.0.1", @@ -5542,23 +6496,6 @@ "from": "semver@>=4.0.3 <5.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, - "semver-regex": { - "version": "1.0.0", - "from": "semver-regex@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz" - }, - "semver-truncate": { - "version": "1.1.0", - "from": "semver-truncate@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.0.tgz", - "dependencies": { - "semver": { - "version": "5.3.0", - "from": "semver@>=5.0.3 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" - } - } - }, "sendgrid": { "version": "4.0.2", "from": "sendgrid@>=4.0.1 <5.0.0", @@ -5648,11 +6585,6 @@ "from": "sha.js@2.2.6", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz" }, - "shebang-regex": { - "version": "1.0.0", - "from": "shebang-regex@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - }, "shelljs": { "version": "0.6.0", "from": "shelljs@0.6.0", @@ -5709,16 +6641,9 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, "source-map-support": { - "version": "0.2.10", - "from": "source-map-support@>=0.2.10 <0.3.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "dependencies": { - "source-map": { - "version": "0.1.32", - "from": "source-map@0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" - } - } + "version": "0.4.6", + "from": "source-map-support@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.6.tgz" }, "sparkles": { "version": "1.0.0", @@ -5855,9 +6780,9 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.1.tgz" }, "superagent": { - "version": "1.8.4", + "version": "1.8.5", "from": "superagent@>=1.7.2 <2.0.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.4.tgz", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.5.tgz", "dependencies": { "form-data": { "version": "1.0.0-rc3", @@ -5917,9 +6842,9 @@ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz" }, "symbol-tree": { - "version": "3.1.4", + "version": "3.2.0", "from": "symbol-tree@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.1.4.tgz" + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.0.tgz" }, "sync-request": { "version": "3.0.1", @@ -6448,9 +7373,9 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.11.1.tgz" }, "whatwg-url": { - "version": "3.0.0", + "version": "3.1.0", "from": "whatwg-url@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-3.0.0.tgz" + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-3.1.0.tgz" }, "whet.extend": { "version": "0.9.9", diff --git a/package.json b/package.json index 2e4bf76370..9456cab1e3 100644 --- a/package.json +++ b/package.json @@ -20,17 +20,18 @@ "author": "Steemit, Inc.", "license": "MIT", "dependencies": { + "@steem/crypto-session": "git+https://github.com/steemit/crypto-session.git", "assert": "^1.3.0", "autoprefixer-loader": "^3.2.0", - "babel-cli": "^6.8.0", - "babel-core": "^6.8.0", + "babel-cli": "^6.18.0", + "babel-core": "^6.20.0", "babel-eslint": "^6.0.4", - "babel-loader": "^6.2.1", + "babel-loader": "^6.2.9", "babel-plugin-react-intl": "^2.2.0", - "babel-plugin-transform-runtime": "^6.8.0", - "babel-preset-es2015": "^6.3.13", - "babel-preset-react": "^6.3.13", - "babel-preset-stage-0": "^6.3.13", + "babel-plugin-transform-runtime": "^6.15.0", + "babel-preset-es2015": "^6.18.0", + "babel-preset-react": "^6.16.0", + "babel-preset-stage-0": "^6.16.0", "bigi": "^1.4.1", "blocked": "^1.1.0", "blueimp-file-upload": "^9.12.5", @@ -72,7 +73,6 @@ "koa-route": "^2.4.2", "koa-router": "^5.4.0", "koa-session": "^3.3.1", - "@steem/crypto-session": "git+https://github.com/steemit/crypto-session.git", "koa-static-cache": "^3.1.2", "lodash.debounce": "^4.0.7", "medium-editor-insert-plugin": "^2.3.2", @@ -80,15 +80,13 @@ "mixpanel": "^0.5.0", "mysql": "^2.10.2", "net": "^1.0.2", - "newrelic": "^1.33.0", "node-sass": "^3.4.2", "pluralize": "^2.0.0", "purest": "^2.0.1", "raw-loader": "^0.5.1", - "react": "^15.3.2", - "react-addons-pure-render-mixin": "^15.3.2", - "react-addons-test-utils": "^15.3.2", - "react-dom": "^15.3.2", + "react": "^15.4.1", + "react-addons-pure-render-mixin": "^15.4.1", + "react-dom": "^15.4.1", "react-foundation-components": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", "react-highcharts": "^8.3.3", "react-intl": "^2.1.3", @@ -151,8 +149,8 @@ "koa-webpack-hot-middleware": "^1.0.3", "mocha": "^2.4.5", "node-watch": "^0.3.5", - "react-addons-perf": "15.3.2", - "react-addons-test-utils": "^15.3.2", + "react-addons-perf": "^15.4.1", + "react-addons-test-utils": "^15.4.1", "react-transform-catch-errors": "^1.0.1", "react-transform-hmr": "^1.0.4", "redbox-react": "^1.2.0", diff --git a/server/server.js b/server/server.js index efc6829777..f22c2d3159 100644 --- a/server/server.js +++ b/server/server.js @@ -1,4 +1,4 @@ -if(process.env.NEW_RELIC_APP_NAME) require('newrelic'); +// newrelic is not working with latest npm if(process.env.NEW_RELIC_APP_NAME) require('newrelic'); import path from 'path'; import Koa from 'koa'; diff --git a/webpack/base.config.js b/webpack/base.config.js index 19d3b7aebc..3fe01f3e59 100644 --- a/webpack/base.config.js +++ b/webpack/base.config.js @@ -59,7 +59,6 @@ export default { modulesDirectories: ['node_modules'] }, externals: { - newrelic: true } }; /* medium-editor, add to plugins[] From b5bd494ae0e8c3d73bd21f005b62c82be7b0081f Mon Sep 17 00:00:00 2001 From: valzav Date: Wed, 14 Dec 2016 11:44:58 -0500 Subject: [PATCH 59/61] rollback to prev version of react-foundation-components in order to fix dropdown issue --- npm-shrinkwrap.json | 811 +------------------------------------------- package.json | 2 +- 2 files changed, 15 insertions(+), 798 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 7a0dcf711e..ce7dbb1f94 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -7,11 +7,6 @@ "from": "git+https://github.com/steemit/crypto-session.git", "resolved": "git+https://github.com/steemit/crypto-session.git#5269244ae6bd077023b02ee9e093a524544bd607" }, - "abab": { - "version": "1.0.3", - "from": "abab@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz" - }, "abbrev": { "version": "1.0.9", "from": "abbrev@>=1.0.0 <2.0.0", @@ -27,33 +22,6 @@ "from": "acorn@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" }, - "acorn-globals": { - "version": "1.0.9", - "from": "acorn-globals@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "dependencies": { - "acorn": { - "version": "2.7.0", - "from": "acorn@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz" - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "from": "acorn-jsx@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" - }, - "ajv": { - "version": "4.10.0", - "from": "ajv@>=4.7.0 <5.0.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.10.0.tgz" - }, - "ajv-keywords": { - "version": "1.2.0", - "from": "ajv-keywords@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.2.0.tgz" - }, "align-text": { "version": "0.1.4", "from": "align-text@>=0.1.3 <0.2.0", @@ -69,16 +37,6 @@ "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" }, - "ansi-escapes": { - "version": "1.4.0", - "from": "ansi-escapes@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz" - }, - "ansi-html": { - "version": "0.0.6", - "from": "ansi-html@0.0.6", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.6.tgz" - }, "ansi-regex": { "version": "2.0.0", "from": "ansi-regex@>=2.0.0 <3.0.0", @@ -134,11 +92,6 @@ "from": "array-differ@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz" }, - "array-equal": { - "version": "1.0.0", - "from": "array-equal@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz" - }, "array-find-index": { "version": "1.0.1", "from": "array-find-index@>=1.0.1 <2.0.0", @@ -149,11 +102,6 @@ "from": "array-index@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz" }, - "array-union": { - "version": "1.0.2", - "from": "array-union@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" - }, "array-uniq": { "version": "1.0.3", "from": "array-uniq@>=1.0.0 <2.0.0", @@ -189,11 +137,6 @@ "from": "assert-plus@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, - "assertion-error": { - "version": "1.0.2", - "from": "assertion-error@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz" - }, "async": { "version": "1.5.2", "from": "async@>=1.5.2 <2.0.0", @@ -1796,11 +1739,6 @@ "from": "blueimp-file-upload@>=9.12.5 <10.0.0", "resolved": "https://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-9.12.5.tgz" }, - "boolbase": { - "version": "1.0.0", - "from": "boolbase@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - }, "boom": { "version": "2.10.1", "from": "boom@>=2.0.0 <3.0.0", @@ -1856,16 +1794,6 @@ "from": "bytes@>=2.4.0 <3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz" }, - "caller-path": { - "version": "0.1.0", - "from": "caller-path@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz" - }, - "callsites": { - "version": "0.2.0", - "from": "callsites@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" - }, "camel-case": { "version": "1.2.2", "from": "camel-case@>=1.2.2 <2.0.0", @@ -1913,33 +1841,11 @@ } } }, - "cheerio": { - "version": "0.22.0", - "from": "cheerio@>=0.22.0 <0.23.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "dependencies": { - "lodash.reduce": { - "version": "4.6.0", - "from": "lodash.reduce@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz" - }, - "lodash.some": { - "version": "4.6.0", - "from": "lodash.some@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz" - } - } - }, "chokidar": { "version": "1.6.0", "from": "chokidar@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz" }, - "circular-json": { - "version": "0.3.1", - "from": "circular-json@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz" - }, "clap": { "version": "1.1.1", "from": "clap@>=1.0.9 <2.0.0", @@ -1972,16 +1878,6 @@ "from": "cli-color@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz" }, - "cli-cursor": { - "version": "1.0.2", - "from": "cli-cursor@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz" - }, - "cli-width": { - "version": "2.1.0", - "from": "cli-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz" - }, "cliui": { "version": "2.1.0", "from": "cliui@>=2.1.0 <3.0.0", @@ -2081,11 +1977,6 @@ "from": "commondir@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" }, - "component-emitter": { - "version": "1.2.1", - "from": "component-emitter@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" - }, "composition": { "version": "2.3.0", "from": "composition@>=2.1.1 <3.0.0", @@ -2153,21 +2044,11 @@ "from": "content-type@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, - "content-type-parser": { - "version": "1.0.1", - "from": "content-type-parser@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz" - }, "convert-source-map": { "version": "1.3.0", "from": "convert-source-map@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz" }, - "cookiejar": { - "version": "2.0.6", - "from": "cookiejar@2.0.6", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz" - }, "cookies": { "version": "0.6.1", "from": "cookies@>=0.6.1 <0.7.0", @@ -2218,21 +2099,11 @@ "from": "css-loader@>=0.23.1 <0.24.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz" }, - "css-select": { - "version": "1.2.0", - "from": "css-select@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz" - }, "css-selector-tokenizer": { "version": "0.5.4", "from": "css-selector-tokenizer@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz" }, - "css-what": { - "version": "2.1.0", - "from": "css-what@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz" - }, "cssesc": { "version": "0.1.0", "from": "cssesc@>=0.1.0 <0.2.0", @@ -2248,16 +2119,6 @@ "from": "csso@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz" }, - "cssom": { - "version": "0.3.1", - "from": "cssom@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.1.tgz" - }, - "cssstyle": { - "version": "0.2.37", - "from": "cssstyle@>=0.2.36 <0.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz" - }, "ctype": { "version": "0.5.3", "from": "ctype@0.5.3", @@ -2320,48 +2181,21 @@ "from": "deep-copy@>=1.1.2 <2.0.0", "resolved": "https://registry.npmjs.org/deep-copy/-/deep-copy-1.1.2.tgz" }, - "deep-eql": { - "version": "0.1.3", - "from": "deep-eql@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "dependencies": { - "type-detect": { - "version": "0.1.1", - "from": "type-detect@0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz" - } - } - }, "deep-equal": { "version": "1.0.1", "from": "deep-equal@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz" }, - "deep-is": { - "version": "0.1.3", - "from": "deep-is@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" - }, "defaults": { "version": "1.0.3", "from": "defaults@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" }, - "define-properties": { - "version": "1.1.2", - "from": "define-properties@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz" - }, "defined": { "version": "1.0.0", "from": "defined@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, - "del": { - "version": "2.2.2", - "from": "del@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz" - }, "delayed-stream": { "version": "1.0.0", "from": "delayed-stream@>=1.0.0 <1.1.0", @@ -2397,11 +2231,6 @@ "from": "detect-indent@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" }, - "diff": { - "version": "1.4.0", - "from": "diff@1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz" - }, "diff-match-patch": { "version": "1.0.0", "from": "diff-match-patch@>=1.0.0 <2.0.0", @@ -2412,11 +2241,6 @@ "from": "dns-prefetch-control@0.1.0", "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz" }, - "doctrine": { - "version": "1.5.0", - "from": "doctrine@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" - }, "dom-helpers": { "version": "2.4.0", "from": "dom-helpers@>=2.4.0 <3.0.0", @@ -2434,11 +2258,6 @@ } } }, - "dom-walk": { - "version": "0.1.1", - "from": "dom-walk@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz" - }, "domain-browser": { "version": "1.1.7", "from": "domain-browser@>=1.1.1 <2.0.0", @@ -2583,21 +2402,6 @@ "from": "error-inject@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz" }, - "error-stack-parser": { - "version": "1.3.6", - "from": "error-stack-parser@>=1.3.6 <2.0.0", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz" - }, - "es-abstract": { - "version": "1.6.1", - "from": "es-abstract@>=1.3.2 <2.0.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.6.1.tgz" - }, - "es-to-primitive": { - "version": "1.1.1", - "from": "es-to-primitive@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz" - }, "es5-ext": { "version": "0.10.12", "from": "es5-ext@>=0.10.11 <0.11.0", @@ -2608,16 +2412,6 @@ "from": "es6-iterator@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" }, - "es6-map": { - "version": "0.1.4", - "from": "es6-map@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz" - }, - "es6-set": { - "version": "0.1.4", - "from": "es6-set@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz" - }, "es6-symbol": { "version": "3.1.0", "from": "es6-symbol@>=3.0.2 <4.0.0", @@ -2650,69 +2444,11 @@ "from": "escape-string-regexp@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, - "escodegen": { - "version": "1.8.1", - "from": "escodegen@>=1.6.1 <2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "dependencies": { - "estraverse": { - "version": "1.9.3", - "from": "estraverse@>=1.9.1 <2.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" - }, - "source-map": { - "version": "0.2.0", - "from": "source-map@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" - } - } - }, - "escope": { - "version": "3.6.0", - "from": "escope@>=3.6.0 <4.0.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "dependencies": { - "es6-weak-map": { - "version": "2.0.1", - "from": "es6-weak-map@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz" - } - } - }, - "espree": { - "version": "3.3.2", - "from": "espree@>=3.1.6 <4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.3.2.tgz", - "dependencies": { - "acorn": { - "version": "4.0.3", - "from": "acorn@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.3.tgz" - } - } - }, "esprima": { "version": "2.7.2", "from": "esprima@>=2.6.0 <3.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" }, - "esrecurse": { - "version": "4.1.0", - "from": "esrecurse@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", - "dependencies": { - "estraverse": { - "version": "4.1.1", - "from": "estraverse@>=4.1.0 <4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz" - } - } - }, - "estraverse": { - "version": "4.2.0", - "from": "estraverse@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" - }, "estraverse-fb": { "version": "1.3.1", "from": "estraverse-fb@>=1.3.1 <2.0.0", @@ -2743,11 +2479,6 @@ "from": "events@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" }, - "exit-hook": { - "version": "1.1.1", - "from": "exit-hook@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz" - }, "expand-brackets": { "version": "0.1.5", "from": "expand-brackets@>=0.1.4 <0.2.0", @@ -2788,11 +2519,6 @@ "from": "fancy-log@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz" }, - "fast-levenshtein": { - "version": "2.0.5", - "from": "fast-levenshtein@>=2.0.4 <2.1.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz" - }, "fastparse": { "version": "1.1.1", "from": "fastparse@>=1.1.1 <2.0.0", @@ -2810,16 +2536,6 @@ } } }, - "figures": { - "version": "1.7.0", - "from": "figures@>=1.3.5 <2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz" - }, - "file-entry-cache": { - "version": "1.3.1", - "from": "file-entry-cache@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz" - }, "file-loader": { "version": "0.8.5", "from": "file-loader@>=0.8.5 <0.9.0", @@ -2894,11 +2610,6 @@ "from": "flagged-respawn@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz" }, - "flat-cache": { - "version": "1.2.1", - "from": "flat-cache@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.1.tgz" - }, "flatten": { "version": "1.0.2", "from": "flatten@1.0.2", @@ -2919,11 +2630,6 @@ "from": "for-own@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz" }, - "foreach": { - "version": "2.0.5", - "from": "foreach@>=2.0.5 <3.0.0", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" - }, "forever-agent": { "version": "0.6.1", "from": "forever-agent@>=0.6.1 <0.7.0", @@ -2934,11 +2640,6 @@ "from": "form-data@>=1.0.0-rc4 <1.1.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" }, - "formatio": { - "version": "1.1.1", - "from": "formatio@1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz" - }, "formidable": { "version": "1.0.17", "from": "formidable@1.0.17", @@ -3596,11 +3297,6 @@ "from": "function-bind@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" }, - "function.prototype.name": { - "version": "1.0.0", - "from": "function.prototype.name@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.0.tgz" - }, "gauge": { "version": "2.6.0", "from": "gauge@>=2.6.0 <2.7.0", @@ -3759,18 +3455,6 @@ "from": "glob2base@>=0.0.12 <0.0.13", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz" }, - "global": { - "version": "4.3.1", - "from": "global@>=4.3.0 <5.0.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.1.tgz", - "dependencies": { - "process": { - "version": "0.5.2", - "from": "process@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz" - } - } - }, "global-modules": { "version": "0.2.3", "from": "global-modules@>=0.2.0 <0.3.0", @@ -3786,18 +3470,6 @@ "from": "globals@>=8.3.0 <9.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz" }, - "globby": { - "version": "5.0.0", - "from": "globby@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "dependencies": { - "glob": { - "version": "7.1.1", - "from": "glob@^7.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" - } - } - }, "globule": { "version": "1.0.0", "from": "globule@>=1.0.0 <2.0.0", @@ -3840,11 +3512,6 @@ "from": "grant-koa@>=3.6.0 <4.0.0", "resolved": "https://registry.npmjs.org/grant-koa/-/grant-koa-3.6.3.tgz" }, - "growl": { - "version": "1.9.2", - "from": "growl@1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz" - }, "gulp": { "version": "3.9.1", "from": "gulp@>=3.9.1 <4.0.0", @@ -4005,16 +3672,6 @@ "from": "html-comment-regex@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" }, - "html-encoding-sniffer": { - "version": "1.0.1", - "from": "html-encoding-sniffer@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz" - }, - "html-entities": { - "version": "1.2.0", - "from": "html-entities@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.0.tgz" - }, "htmlparser2": { "version": "3.9.1", "from": "htmlparser2@>=3.9.0 <4.0.0", @@ -4087,11 +3744,6 @@ "from": "ienoopen@1.0.0", "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz" }, - "ignore": { - "version": "3.2.0", - "from": "ignore@>=3.1.2 <4.0.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.0.tgz" - }, "immutable": { "version": "3.8.1", "from": "immutable@>=3.7.6 <4.0.0", @@ -4109,11 +3761,6 @@ } } }, - "imurmurhash": { - "version": "0.1.4", - "from": "imurmurhash@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - }, "in-publish": { "version": "2.0.0", "from": "in-publish@>=2.0.0 <3.0.0", @@ -4166,11 +3813,6 @@ "from": "ini@>=1.3.4 <2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, - "inquirer": { - "version": "0.12.0", - "from": "inquirer@>=0.12.0 <0.13.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz" - }, "int64-buffer": { "version": "0.1.9", "from": "int64-buffer@>=0.1.9 <0.2.0", @@ -4248,16 +3890,6 @@ "from": "is-builtin-module@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz" }, - "is-callable": { - "version": "1.1.3", - "from": "is-callable@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz" - }, - "is-date-object": { - "version": "1.0.1", - "from": "is-date-object@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz" - }, "is-dotfile": { "version": "1.0.2", "from": "is-dotfile@>=1.0.0 <2.0.0", @@ -4288,11 +3920,6 @@ "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" }, - "is-generator": { - "version": "1.0.3", - "from": "is-generator@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz" - }, "is-glob": { "version": "2.0.1", "from": "is-glob@>=2.0.0 <3.0.0", @@ -4308,21 +3935,6 @@ "from": "is-number@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" }, - "is-path-cwd": { - "version": "1.0.0", - "from": "is-path-cwd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" - }, - "is-path-in-cwd": { - "version": "1.0.0", - "from": "is-path-in-cwd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz" - }, - "is-path-inside": { - "version": "1.0.0", - "from": "is-path-inside@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" - }, "is-plain-obj": { "version": "1.1.0", "from": "is-plain-obj@>=1.0.0 <2.0.0", @@ -4348,41 +3960,21 @@ "from": "is-property@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" }, - "is-regex": { - "version": "1.0.3", - "from": "is-regex@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.3.tgz" - }, "is-relative": { "version": "0.2.1", "from": "is-relative@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz" }, - "is-resolvable": { - "version": "1.0.0", - "from": "is-resolvable@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz" - }, "is-stream": { "version": "1.1.0", "from": "is-stream@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" }, - "is-subset": { - "version": "0.1.1", - "from": "is-subset@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz" - }, "is-svg": { "version": "2.0.1", "from": "is-svg@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.0.1.tgz" }, - "is-symbol": { - "version": "1.0.1", - "from": "is-symbol@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz" - }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", @@ -4433,23 +4025,6 @@ "from": "isstream@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, - "jade": { - "version": "0.26.3", - "from": "jade@0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "dependencies": { - "commander": { - "version": "0.6.1", - "from": "commander@0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" - }, - "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" - } - } - }, "jodid25519": { "version": "1.0.2", "from": "jodid25519@>=1.0.0 <2.0.0", @@ -4505,11 +4080,6 @@ "from": "json-schema@0.2.2", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" }, - "json-stable-stringify": { - "version": "1.0.1", - "from": "json-stable-stringify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@>=5.0.1 <5.1.0", @@ -4525,11 +4095,6 @@ "from": "jsonfile@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.3.1.tgz" }, - "jsonify": { - "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - }, "jsonpointer": { "version": "2.0.0", "from": "jsonpointer@2.0.0", @@ -4714,11 +4279,6 @@ "from": "lcid@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" }, - "levn": { - "version": "0.3.0", - "from": "levn@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - }, "libsodium": { "version": "0.4.8", "from": "libsodium@>=0.4.8 <0.5.0", @@ -4841,21 +4401,11 @@ "from": "lodash.assign@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.1.0.tgz" }, - "lodash.assignin": { - "version": "4.2.0", - "from": "lodash.assignin@>=4.0.9 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz" - }, "lodash.assignwith": { "version": "4.1.0", "from": "lodash.assignwith@>=4.0.7 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.1.0.tgz" }, - "lodash.bind": { - "version": "4.2.1", - "from": "lodash.bind@>=4.1.4 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz" - }, "lodash.camelcase": { "version": "3.0.1", "from": "lodash.camelcase@>=3.0.1 <4.0.0", @@ -4876,31 +4426,11 @@ "from": "lodash.deburr@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz" }, - "lodash.defaults": { - "version": "4.2.0", - "from": "lodash.defaults@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" - }, "lodash.escape": { "version": "3.2.0", "from": "lodash.escape@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz" }, - "lodash.filter": { - "version": "4.6.0", - "from": "lodash.filter@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz" - }, - "lodash.flatten": { - "version": "4.4.0", - "from": "lodash.flatten@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" - }, - "lodash.foreach": { - "version": "4.5.0", - "from": "lodash.foreach@>=4.3.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" - }, "lodash.indexof": { "version": "4.0.5", "from": "lodash.indexof@>=4.0.5 <5.0.0", @@ -4946,21 +4476,11 @@ "from": "lodash.keysin@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz" }, - "lodash.map": { - "version": "4.6.0", - "from": "lodash.map@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" - }, "lodash.mapvalues": { "version": "4.5.0", "from": "lodash.mapvalues@>=4.4.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.5.0.tgz" }, - "lodash.merge": { - "version": "4.6.0", - "from": "lodash.merge@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz" - }, "lodash.pick": { "version": "4.3.0", "from": "lodash.pick@>=4.2.1 <5.0.0", @@ -4976,11 +4496,6 @@ "from": "lodash.reduce@4.2.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.2.0.tgz" }, - "lodash.reject": { - "version": "4.6.0", - "from": "lodash.reject@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz" - }, "lodash.rest": { "version": "4.0.4", "from": "lodash.rest@>=4.0.0 <5.0.0", @@ -5023,11 +4538,6 @@ "from": "lodash.words@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz" }, - "lolex": { - "version": "1.3.2", - "from": "lolex@1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz" - }, "long": { "version": "3.2.0", "from": "long@>=3.0.0 <4.0.0", @@ -5145,11 +4655,6 @@ "from": "mime-types@>=2.1.7 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" }, - "min-document": { - "version": "2.19.0", - "from": "min-document@>=2.19.0 <3.0.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" - }, "minimatch": { "version": "3.0.2", "from": "minimatch@>=3.0.2 <4.0.0", @@ -5214,11 +4719,6 @@ "from": "multipipe@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz" }, - "mute-stream": { - "version": "0.0.5", - "from": "mute-stream@0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" - }, "mysql": { "version": "2.11.1", "from": "mysql@>=2.10.2 <3.0.0", @@ -5352,11 +4852,6 @@ "from": "npmlog@>=0.0.0 <1.0.0||>=1.0.0 <2.0.0||>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz" }, - "nth-check": { - "version": "1.0.1", - "from": "nth-check@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz" - }, "num2fraction": { "version": "1.2.2", "from": "num2fraction@>=1.2.2 <2.0.0", @@ -5367,11 +4862,6 @@ "from": "number-is-nan@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" }, - "nwmatcher": { - "version": "1.3.9", - "from": "nwmatcher@>=1.3.7 <2.0.0", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.3.9.tgz" - }, "oauth-sign": { "version": "0.8.2", "from": "oauth-sign@>=0.8.1 <0.9.0", @@ -5382,36 +4872,11 @@ "from": "object-assign@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" }, - "object-is": { - "version": "1.0.1", - "from": "object-is@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz" - }, - "object-keys": { - "version": "1.0.11", - "from": "object-keys@>=1.0.10 <2.0.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz" - }, - "object.assign": { - "version": "4.0.4", - "from": "object.assign@>=4.0.3 <5.0.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz" - }, - "object.entries": { - "version": "1.0.4", - "from": "object.entries@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz" - }, "object.omit": { "version": "2.0.0", "from": "object.omit@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz" }, - "object.values": { - "version": "1.0.4", - "from": "object.values@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz" - }, "on-finished": { "version": "2.3.0", "from": "on-finished@>=2.1.0 <3.0.0", @@ -5422,11 +4887,6 @@ "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" }, - "onetime": { - "version": "1.1.0", - "from": "onetime@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" - }, "only": { "version": "0.0.2", "from": "only@0.0.2", @@ -5444,18 +4904,6 @@ } } }, - "optionator": { - "version": "0.8.2", - "from": "optionator@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "from": "wordwrap@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - } - } - }, "orchestrator": { "version": "0.3.7", "from": "orchestrator@>=0.3.0 <0.4.0", @@ -5516,11 +4964,6 @@ "from": "parse-json@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" }, - "parse5": { - "version": "1.5.1", - "from": "parse5@>=1.5.1 <2.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz" - }, "parseurl": { "version": "1.3.1", "from": "parseurl@>=1.3.0 <2.0.0", @@ -5546,11 +4989,6 @@ "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" }, - "path-is-inside": { - "version": "1.0.2", - "from": "path-is-inside@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - }, "path-root": { "version": "0.1.1", "from": "path-root@>=0.1.1 <0.2.0", @@ -5807,11 +5245,6 @@ "from": "postcss-zindex@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.1.1.tgz" }, - "prelude-ls": { - "version": "1.1.2", - "from": "prelude-ls@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - }, "prepend-http": { "version": "1.0.4", "from": "prepend-http@>=1.0.0 <2.0.0", @@ -5842,11 +5275,6 @@ "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, - "progress": { - "version": "1.1.8", - "from": "progress@>=1.1.8 <2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" - }, "promise": { "version": "7.1.1", "from": "promise@>=7.1.1 <8.0.0", @@ -5981,11 +5409,6 @@ "from": "randomatic@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz" }, - "range-parser": { - "version": "1.2.0", - "from": "range-parser@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" - }, "raw-body": { "version": "2.1.7", "from": "raw-body@>=2.1.2 <2.2.0", @@ -6018,11 +5441,6 @@ "from": "react-addons-pure-render-mixin@>=15.4.1 <16.0.0", "resolved": "https://registry.npmjs.org/react-addons-pure-render-mixin/-/react-addons-pure-render-mixin-15.4.1.tgz" }, - "react-deep-force-update": { - "version": "1.0.1", - "from": "react-deep-force-update@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz" - }, "react-dom": { "version": "15.4.1", "from": "react-dom@15.4.1", @@ -6030,8 +5448,8 @@ }, "react-foundation-components": { "version": "0.12.0", - "from": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", - "resolved": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", + "from": "git+https://github.com/valzav/react-foundation-components.git#d14362c7c8eee946a4acc3b18d70271d5a82813e", + "resolved": "git+https://github.com/valzav/react-foundation-components.git#d14362c7c8eee946a4acc3b18d70271d5a82813e", "dependencies": { "foundation-sites": { "version": "6.2.4", @@ -6043,6 +5461,18 @@ "from": "lodash@>=4.16.1 <5.0.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" }, + "react-overlays": { + "version": "0.6.3", + "from": "react-overlays@0.6.3", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.6.3.tgz", + "dependencies": { + "react-prop-types": { + "version": "0.2.2", + "from": "react-prop-types@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.2.2.tgz" + } + } + }, "uncontrollable": { "version": "4.0.3", "from": "uncontrollable@>=4.0.3 <5.0.0", @@ -6075,23 +5505,6 @@ "from": "react-notification@>=5.0.7 <6.0.0", "resolved": "https://registry.npmjs.org/react-notification/-/react-notification-5.0.7.tgz" }, - "react-overlays": { - "version": "0.6.10", - "from": "react-overlays@>=0.6.3 <0.7.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.6.10.tgz", - "dependencies": { - "react-prop-types": { - "version": "0.4.0", - "from": "react-prop-types@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz" - }, - "warning": { - "version": "3.0.0", - "from": "warning@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" - } - } - }, "react-portal": { "version": "2.2.1", "from": "react-portal@>=2.2.1 <3.0.0", @@ -6102,11 +5515,6 @@ "from": "react-prop-types@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.3.2.tgz" }, - "react-proxy": { - "version": "1.1.8", - "from": "react-proxy@>=1.1.7 <2.0.0", - "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz" - }, "react-qr": { "version": "0.0.2", "from": "react-qr@0.0.2", @@ -6174,11 +5582,6 @@ "from": "readdirp@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz" }, - "readline2": { - "version": "1.0.1", - "from": "readline2@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz" - }, "rechoir": { "version": "0.6.2", "from": "rechoir@>=0.6.2 <0.7.0", @@ -6194,11 +5597,6 @@ "from": "redent@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" }, - "reduce-component": { - "version": "1.0.1", - "from": "reduce-component@1.0.1", - "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz" - }, "reduce-css-calc": { "version": "1.3.0", "from": "reduce-css-calc@>=1.2.6 <2.0.0", @@ -6360,11 +5758,6 @@ "from": "require-main-filename@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" }, - "require-uncached": { - "version": "1.0.3", - "from": "require-uncached@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz" - }, "resolve": { "version": "1.1.7", "from": "resolve@>=1.0.0 <2.0.0", @@ -6375,16 +5768,6 @@ "from": "resolve-dir@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.0.tgz" }, - "resolve-from": { - "version": "1.0.1", - "from": "resolve-from@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" - }, - "restore-cursor": { - "version": "1.0.1", - "from": "restore-cursor@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" - }, "retry-as-promised": { "version": "2.0.1", "from": "retry-as-promised@>=2.0.0 <3.0.0", @@ -6424,21 +5807,6 @@ "from": "rndm@1.2.0", "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz" }, - "run-async": { - "version": "0.1.0", - "from": "run-async@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz" - }, - "rx-lite": { - "version": "3.1.2", - "from": "rx-lite@>=3.1.2 <4.0.0", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" - }, - "samsam": { - "version": "1.1.2", - "from": "samsam@1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz" - }, "sanitize-html": { "version": "1.13.0", "from": "sanitize-html@>=1.11.4 <2.0.0", @@ -6615,11 +5983,6 @@ "from": "slash@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" }, - "slice-ansi": { - "version": "0.0.4", - "from": "slice-ansi@0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz" - }, "sntp": { "version": "1.0.9", "from": "sntp@>=1.0.0 <2.0.0", @@ -6697,11 +6060,6 @@ } } }, - "stackframe": { - "version": "0.3.1", - "from": "stackframe@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz" - }, "statuses": { "version": "1.3.0", "from": "statuses@>=1.2.0 <2.0.0", @@ -6769,48 +6127,11 @@ "from": "strip-indent@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" }, - "strip-json-comments": { - "version": "1.0.4", - "from": "strip-json-comments@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" - }, "style-loader": { "version": "0.13.1", "from": "style-loader@>=0.13.0 <0.14.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.1.tgz" }, - "superagent": { - "version": "1.8.5", - "from": "superagent@>=1.7.2 <2.0.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.5.tgz", - "dependencies": { - "form-data": { - "version": "1.0.0-rc3", - "from": "form-data@1.0.0-rc3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz" - }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "mime": { - "version": "1.3.4", - "from": "mime@1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "qs": { - "version": "2.3.3", - "from": "qs@2.3.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" - }, - "readable-stream": { - "version": "1.0.27-1", - "from": "readable-stream@1.0.27-1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz" - } - } - }, "supports-color": { "version": "3.1.2", "from": "supports-color@>=3.1.2 <4.0.0", @@ -6841,11 +6162,6 @@ "from": "symbol-observable@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz" }, - "symbol-tree": { - "version": "3.2.0", - "from": "symbol-tree@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.0.tgz" - }, "sync-request": { "version": "3.0.1", "from": "sync-request@>=3.0.1 <4.0.0", @@ -6856,23 +6172,6 @@ "from": "synthetic-dom@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/synthetic-dom/-/synthetic-dom-0.1.4.tgz" }, - "table": { - "version": "3.8.3", - "from": "table@>=3.7.8 <4.0.0", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - }, - "string-width": { - "version": "2.0.0", - "from": "string-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz" - } - } - }, "tapable": { "version": "0.1.10", "from": "tapable@>=0.1.8 <0.2.0", @@ -6905,11 +6204,6 @@ "from": "terraformer-wkt-parser@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.0.tgz" }, - "text-table": { - "version": "0.2.0", - "from": "text-table@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - }, "then-request": { "version": "2.2.0", "from": "then-request@>=2.0.1 <3.0.0", @@ -6925,11 +6219,6 @@ "from": "thenify-all@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" }, - "through": { - "version": "2.3.8", - "from": "through@>=2.3.6 <3.0.0", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - }, "through2": { "version": "2.0.1", "from": "through2@>=2.0.0 <3.0.0", @@ -6972,11 +6261,6 @@ "from": "to-fast-properties@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz" }, - "to-iso-string": { - "version": "0.0.2", - "from": "to-iso-string@0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz" - }, "toposort-class": { "version": "1.0.1", "from": "toposort-class@>=1.0.1 <2.0.0", @@ -6987,21 +6271,11 @@ "from": "tough-cookie@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz" }, - "tr46": { - "version": "0.0.3", - "from": "tr46@>=0.0.3 <0.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - }, "trim-newlines": { "version": "1.0.0", "from": "trim-newlines@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" }, - "tryit": { - "version": "1.0.3", - "from": "tryit@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz" - }, "tsscmp": { "version": "1.0.5", "from": "tsscmp@1.0.5", @@ -7022,16 +6296,6 @@ "from": "tweetnacl@>=0.13.0 <0.14.0", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" }, - "type-check": { - "version": "0.3.2", - "from": "type-check@>=0.3.2 <0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - }, - "type-detect": { - "version": "1.0.0", - "from": "type-detect@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz" - }, "type-is": { "version": "1.6.13", "from": "type-is@>=1.5.5 <2.0.0", @@ -7173,11 +6437,6 @@ "from": "utils-merge@1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, - "uuid": { - "version": "2.0.3", - "from": "uuid@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz" - }, "v8flags": { "version": "2.0.11", "from": "v8flags@>=2.0.10 <3.0.0", @@ -7277,11 +6536,6 @@ } } }, - "webidl-conversions": { - "version": "3.0.1", - "from": "webidl-conversions@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - }, "webpack": { "version": "1.13.2", "from": "webpack@1.13.2", @@ -7318,23 +6572,6 @@ } } }, - "webpack-dev-middleware": { - "version": "1.8.4", - "from": "webpack-dev-middleware@>=1.8.4 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.8.4.tgz", - "dependencies": { - "mime": { - "version": "1.3.4", - "from": "mime@>=1.3.4 <2.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - } - } - }, - "webpack-hot-middleware": { - "version": "2.13.2", - "from": "webpack-hot-middleware@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.13.2.tgz" - }, "webpack-isomorphic-tools": { "version": "2.5.2", "from": "webpack-isomorphic-tools@>=2.2.31 <3.0.0", @@ -7362,21 +6599,11 @@ "from": "what-input@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/what-input/-/what-input-2.1.1.tgz" }, - "whatwg-encoding": { - "version": "1.0.1", - "from": "whatwg-encoding@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz" - }, "whatwg-fetch": { "version": "0.11.1", "from": "whatwg-fetch@>=0.11.1 <0.12.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.11.1.tgz" }, - "whatwg-url": { - "version": "3.1.0", - "from": "whatwg-url@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-3.1.0.tgz" - }, "whet.extend": { "version": "0.9.9", "from": "whet.extend@>=0.9.9 <0.10.0", @@ -7422,21 +6649,11 @@ "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" }, - "write": { - "version": "0.2.1", - "from": "write@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" - }, "x-xss-protection": { "version": "1.0.0", "from": "x-xss-protection@1.0.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz" }, - "xml-name-validator": { - "version": "2.0.1", - "from": "xml-name-validator@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz" - }, "xmldom": { "version": "0.1.22", "from": "xmldom@>=0.1.22 <0.2.0", diff --git a/package.json b/package.json index 9456cab1e3..8ad491c4b7 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "react": "^15.4.1", "react-addons-pure-render-mixin": "^15.4.1", "react-dom": "^15.4.1", - "react-foundation-components": "git+https://github.com/valzav/react-foundation-components.git#0bccbd96f5313b5b7517cc9de97925016ed67d45", + "react-foundation-components": "git+https://github.com/valzav/react-foundation-components.git#d14362c7c8eee946a4acc3b18d70271d5a82813e", "react-highcharts": "^8.3.3", "react-intl": "^2.1.3", "react-medium-editor": "^1.8.0", From 0a6757bbfd3eb004cd10472f61419a4bcdc8d010 Mon Sep 17 00:00:00 2001 From: valzav Date: Wed, 14 Dec 2016 14:48:54 -0500 Subject: [PATCH 60/61] mark fsevents as optional dep (fixes linux instal issue with npm ~4.0.3) --- package.json | 3 +++ release-notes.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ad491c4b7..83571df8ea 100644 --- a/package.json +++ b/package.json @@ -158,6 +158,9 @@ "sinon-chai": "^2.8.0", "supertest": "^1.2.0" }, + "optionalDependencies": { + "fsevents": "*" + }, "engines": { "node": ">=6.0.0" } diff --git a/release-notes.txt b/release-notes.txt index 764154ce24..dad5a863b2 100644 --- a/release-notes.txt +++ b/release-notes.txt @@ -1,5 +1,5 @@ --------------------------------------------------------------------- -0.1.161212 +0.1.161214 --------------------------------------------------------------------- - ability to set witness proxy voter #797 From 50562433d0813031a3cbe1399486826e72f24ffb Mon Sep 17 00:00:00 2001 From: valzav Date: Wed, 14 Dec 2016 16:05:42 -0500 Subject: [PATCH 61/61] make cookie name configurable --- config/steem-example.json | 10 ++++++---- server/server.js | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/config/steem-example.json b/config/steem-example.json index 927142c5d2..81f2f54972 100644 --- a/config/steem-example.json +++ b/config/steem-example.json @@ -1,12 +1,14 @@ { "db": { "username": "root", - "password": null, + "password": "", "database": "steemit_dev", "host": "127.0.0.1", "dialect": "mysql" }, + "session_cookie_key": "stm-dev", "session_key": "steemses", + "server_session_secret": "somelongsecretstring", "grant": { "server": { "protocol": "http", @@ -31,8 +33,8 @@ ] } }, - "server_session_secret": "", - "helmet": {}, + "helmet": { + }, "registrar": { "account": "-", "signing_key": "-", @@ -67,9 +69,9 @@ "username": "guest", "password": "" }, + "mixpanel": "", "img_proxy_prefix": "", "ipfs_prefix": "", - "google_analytics_id": "", "disable_signups": false, "read_only_mode": false, "uploadImage": "https://..." diff --git a/server/server.js b/server/server.js index f22c2d3159..941c1cdcd2 100644 --- a/server/server.js +++ b/server/server.js @@ -34,7 +34,7 @@ const cacheOpts = {maxAge: 86400000, gzip: true}; app.keys = [config.session_key]; const crypto_key = config.server_session_secret; -session(app, {maxAge: 1000 * 3600 * 24 * 60, crypto_key}); +session(app, {maxAge: 1000 * 3600 * 24 * 60, crypto_key, key: config.session_cookie_key}); csrf(app); app.use(mount(grant));
    Date CreatedTypePriceSTEEMSD ($)Action{translate('date_created')}{translate('type')}{translate('price')}{LIQUID_TOKEN}{`${DEBT_TOKEN_SHORT} (${CURRENCY_SIGN})`}{translate('action')}