+ )
}
}
-
diff --git a/web/components/Listings.js b/web/src/components/Listings.js
similarity index 52%
rename from web/components/Listings.js
rename to web/src/components/Listings.js
index 5f6ceda..8d2a339 100644
--- a/web/components/Listings.js
+++ b/web/src/components/Listings.js
@@ -1,45 +1,52 @@
-import React from 'react';
-import {findDOMNode} from 'react-dom';
-import {formatPrice, listingImageUrl} from '../lib/helpers';
-import {loadListing} from '../lib/api';
+import React from 'react'
+import {findDOMNode} from 'react-dom'
+import {formatPrice, listingImageUrl} from '../lib/helpers'
+import {loadListing} from '../lib/api'
export default class Listings extends React.Component {
- constructor(props) {
- super(props);
+ constructor (props) {
+ super(props)
- this.handleScroll = (e) => {
- const node = e.target;
- const offset = node.scrollHeight - node.scrollTop - node.clientHeight;
+ this.handleScroll = e => {
+ const node = e.target
+ const offset = node.scrollHeight - node.scrollTop - node.clientHeight
if (this.props && this.props.loadingMore) {
- return;
+ return
}
if (offset < 50) {
- this.props.dispatch({type: 'LOAD_MORE_LISTINGS'});
+ this.props.dispatch({type: 'LOAD_MORE_LISTINGS'})
}
}
}
- onListingClick(id) {
+ onListingClick (id) {
loadListing(id).then(l => l.text()).then(l => {
- this.props.dispatch({type: 'UPDATE_ROUTE', action: {
- toDispatch: {
- type: 'VIEW_LISTING_DETAILS', action: {
- id,
- listing: JSON.parse(l)
+ this.props.dispatch({
+ type: 'UPDATE_ROUTE',
+ action: {
+ toDispatch: {
+ type: 'VIEW_LISTING_DETAILS',
+ action: {
+ id,
+ listing: JSON.parse(l)
+ }
+ },
+ params: {
+ listingId: id
}
- },
- params: {
- listingId: id
}
- }});
+ })
- this.props.dispatch({type: 'VIEW_LISTING_DETAILS', action: {
- id,
- listing: JSON.parse(l)
- }});
- });
+ this.props.dispatch({
+ type: 'VIEW_LISTING_DETAILS',
+ action: {
+ id,
+ listing: JSON.parse(l)
+ }
+ })
+ })
}
onMouseEnter (id) {
@@ -48,40 +55,46 @@ export default class Listings extends React.Component {
action: {
id
}
- });
+ })
}
renderListings () {
- const {listings = (new Map())} = this.props;
+ const {listings = new Map()} = this.props
if (listings.size === 0) {
- return (
+ )
}
- const rendered = [];
+ const rendered = []
- for(const l of listings.values()) {
- const {images} = l;
+ for (const l of listings.values()) {
+ const {images} = l
rendered.push(
+ onClick={this.onListingClick.bind(this, l._id)}
+ >
-
})
+
{formatPrice(l.price)}
-
{l.rooms ? `${l.rooms} sobe, `: null}{l.size ? `${l.size}m2`: null}
+
+ {l.rooms ? `${l.rooms} sobe, ` : null}
+ {l.size ? `${l.size}m2` : null}
+
{l.address}
@@ -93,46 +106,50 @@ export default class Listings extends React.Component {
Prije {l.time}
-
- );
+ )
}
- return rendered;
+ return rendered
}
componentDidMount () {
- this.attachScrollListener();
+ this.attachScrollListener()
}
componentWillUnmount () {
- this.removeScrollListener();
+ this.removeScrollListener()
}
attachScrollListener () {
- const listings = findDOMNode(this.refs.listings);
- listings.parentNode.addEventListener('scroll', this.handleScroll);
+ const listings = findDOMNode(this.refs.listings)
+ listings.parentNode.addEventListener('scroll', this.handleScroll)
}
removeScrollListener () {
- const listings = findDOMNode(this.refs.listings);
- listings.parentNode.removeEventListener('scroll', this.handleScroll);
+ const listings = findDOMNode(this.refs.listings)
+ listings.parentNode.removeEventListener('scroll', this.handleScroll)
}
onSortChange (e) {
- this.props.dispatch({type: 'UPDATE_ROUTE', action: {
- params: {
+ this.props.dispatch({
+ type: 'UPDATE_ROUTE',
+ action: {
+ params: {
+ sort: e.target.value
+ }
+ }
+ })
+
+ this.props.dispatch({
+ type: 'SORT_CHANGE',
+ action: {
sort: e.target.value
}
- }});
-
- this.props.dispatch({type: 'SORT_CHANGE', action: {
- sort: e.target.value
- }});
+ })
}
render () {
-
- const {listings = (new Map()), totalCount, sort} = this.props;
+ const {listings = new Map(), totalCount, sort} = this.props
return (
@@ -143,7 +160,8 @@ export default class Listings extends React.Component {
value={sort}
onChange={this.onSortChange.bind(this)}
name="listings-type"
- id="listings-type">
+ id="listings-type"
+ >
@@ -159,6 +177,7 @@ export default class Listings extends React.Component {
{this.renderListings()}
-
)
+
+ )
}
}
diff --git a/web/src/components/Main.js b/web/src/components/Main.js
new file mode 100644
index 0000000..360bc4b
--- /dev/null
+++ b/web/src/components/Main.js
@@ -0,0 +1,592 @@
+import React from 'react'
+import Filters from './Filters'
+import Listings from './Listings'
+import ListingDetails from './ListingDetails'
+import {pacSelectFirst} from '../helpers/googleMaps'
+import {loadProperties, loadSeen, loadListing} from '../lib/api'
+import {handleMessage} from '../lib/handlers'
+import Router from '../lib/router'
+
+class Main extends React.Component {
+ constructor (props) {
+ super(props)
+
+ const state = {
+ listingDetails: false,
+ listings: new Map(),
+ imageIndex: 0,
+ page: 0,
+ sort: 'relevance',
+ filters: {
+ rooms: {},
+ category: {}
+ }
+ }
+
+ if (props.initialState) {
+ props.initialState.sort = props.initialState.sort || state.sort
+ state.filters.rooms = props.initialState.rooms
+ state.filters.category = props.initialState.category
+ state.sort = props.initialState.sort || state.sort
+ state.listingId = props.initialState.listingId
+ state.bounds = props.initialState.bounds
+ state.zoom = props.initialState.zoom
+ if (state.listingId) {
+ state.listingDetails = true
+ }
+ state.filters.minSize = props.initialState.minSize
+ state.filters.maxSize = props.initialState.maxSize
+ state.filters.minPrice = props.initialState.minPrice
+ state.filters.maxPrice = props.initialState.maxPrice
+ }
+
+ this.state = state
+ this.router = new Router(this, props.initialState)
+ }
+
+ dispatch ({type, action = {}}) {
+ handleMessage({type, action}, this)
+ }
+
+ componentDidMount () {
+ const uluru = {lat: 43.845031, lng: 18.4019262}
+ const opts = {
+ //zoom: 13,
+ //center: uluru,
+ streetViewControl: false,
+ mapTypeControl: false
+ }
+
+ if (!this.state.bounds) {
+ opts.zoom = 13
+ opts.center = uluru
+ }
+
+ const map = new google.maps.Map(this.refs.map, opts)
+ window.gmap = map
+
+ //const marker = new google.maps.Marker({
+ //position: uluru,
+ //map: map
+ //});
+
+ var control = document.createElement('div')
+ control.classList.add('filters-btn-toggle')
+ control.innerHTML = '
'
+ //control.style = "top: 200px;"
+ control['style'] = 'top: 200px;'
+
+ var input = document.getElementById('gmaps-places-input')
+
+ pacSelectFirst(input)
+ var options = {
+ componentRestrictions: {country: 'BA'}
+ }
+
+ const regularIdle = () => {
+ this.dispatch({
+ type: 'UPDATE_ROUTE',
+ action: {
+ params: {
+ bounds: map.getBounds().toUrlValue(),
+ zoom: map.getZoom()
+ }
+ }
+ })
+
+ this.dispatch({type: 'MAP_IDLE'})
+ }
+
+ // Check if initial bounds are passed-in
+
+ google.maps.event.addListenerOnce(map, 'idle', () => {
+ if (this.state.bounds) {
+ const [lat1, lng1, lat2, lng2] = this.state.bounds.split(',')
+ const sw = new google.maps.LatLng({
+ lat: parseFloat(lat1),
+ lng: parseFloat(lng1)
+ })
+ const ne = new google.maps.LatLng({
+ lat: parseFloat(lat2),
+ lng: parseFloat(lng2)
+ })
+
+ const initialBounds = new google.maps.LatLngBounds(sw, ne)
+ //map.fitBounds(initialBounds);
+
+ const originalMaxZoom = map.maxZoom
+ const originalMinZoom = map.minZoom
+ map.setOptions({
+ maxZoom: parseInt(this.state.zoom),
+ minZoom: parseInt(this.state.zoom)
+ })
+ map.fitBounds(initialBounds)
+ map.setOptions({maxZoom: originalMaxZoom, minZoom: originalMinZoom})
+ }
+ })
+ map.addListener('idle', regularIdle)
+ var searchBox = new google.maps.places.Autocomplete(input, options)
+
+ searchBox.addListener('place_changed', () => {
+ var place = searchBox.getPlace()
+
+ if (!place.geometry) {
+ return
+ }
+
+ if (place.geometry.viewport) {
+ map.fitBounds(place.geometry.viewport)
+ } else {
+ map.setCenter(place.geometry.location)
+ map.setZoom(18)
+ }
+ this.dispatch({type: 'SEARCH_PLACE_CHANGED'})
+ })
+
+ control.addEventListener('click', e => {
+ this.setState({
+ mapClicked: true
+ })
+ })
+
+ control.index = 1
+ map.controls[google.maps.ControlPosition.TOP_RIGHT].push(control)
+ this.map = map
+
+ // TODO: if state contains listingId reload
+ if (this.state.listingId) {
+ loadListing(this.state.listingId).then(l => l.text()).then(l => {
+ this.dispatch({
+ type: 'VIEW_LISTING_DETAILS',
+ action: {
+ id: this.state.listingId,
+ listing: JSON.parse(l)
+ }
+ })
+ })
+ }
+ }
+
+ removeAllMarkers () {
+ if (this.markers) {
+ this.markers.forEach(m => m.marker.setMap(null))
+ }
+ }
+
+ onCloseClick (e) {
+ if (this.state.mapClicked) {
+ setTimeout(
+ () => {
+ google.maps.event.trigger(this.map, 'resize')
+ },
+ 100
+ )
+ }
+
+ this.setState({
+ mapClicked: false
+ })
+ }
+
+ findMarker (id) {
+ if (!this.markers) {
+ return null
+ }
+
+ const index = this.markers.findIndex(m => m.id === id)
+ return this.markers[index]
+ }
+
+ isSeen (id) {
+ const seen = loadSeen()
+ return seen.findIndex(s => s === id) !== -1
+ }
+
+ loadPins () {
+ const map = this.map
+ const {
+ rooms,
+ minSize,
+ maxSize,
+ minPrice,
+ maxPrice,
+ category
+ } = this.state.filters
+
+ const bounds = map.getBounds()
+ const properties = loadProperties({
+ bounds: bounds.toUrlValue(),
+ rooms,
+ minSize,
+ maxSize,
+ minPrice,
+ maxPrice,
+ category,
+ page: this.state.page,
+ pins: true
+ })
+
+ const markerExists = id => {
+ return this.findMarker(id) != null
+ }
+
+ properties
+ .then(p => {
+ return {
+ body: p.text(),
+ totalCount: p.headers.get('X-Total-Count')
+ }
+ })
+ .then(({body, totalCount}) => {
+ body.then(p => {
+ const data = JSON.parse(p)
+
+ const listingExists = id => {
+ return data.findIndex(l => l._id === id) !== -1
+ }
+
+ const newMarkers = []
+
+ if (this.markers) {
+ this.markers.forEach(m => {
+ if (!listingExists(m.id)) {
+ m.marker.setMap(null)
+ } else {
+ newMarkers.push(m)
+ }
+ })
+ }
+
+ for (const [index, prop] of data.entries()) {
+ const myLatLng = {lat: prop.loc[0], lng: prop.loc[1]}
+
+ if (!markerExists(prop._id)) {
+ const marker = new google.maps.Marker({
+ position: myLatLng,
+ map: map,
+ //title : prop.title,
+ icon: this.isSeen(prop._id)
+ ? this.visitedMarkerIcon()
+ : this.defaultMarkerIcon(),
+ id: prop._id
+ })
+
+ marker.addListener('mouseover', () => {
+ if (marker.id !== this.state.listingId) {
+ if (this.isSeen(marker.id)) {
+ marker.setIcon(this.visitedHoveredMarkerIcon())
+ } else {
+ marker.setIcon(this.hoveredMarkerIcon())
+ }
+ }
+ })
+
+ marker.addListener('mouseout', () => {
+ if (marker.id !== this.state.listingId) {
+ if (this.isSeen(marker.id)) {
+ marker.setIcon(this.visitedMarkerIcon())
+ } else {
+ marker.setIcon(this.defaultMarkerIcon())
+ }
+ }
+ })
+
+ marker.addListener('click', () => {
+ // Maybe move out and call when popping state
+ if (this.state.listingId) {
+ const prevSelected = this.findMarker(this.state.listingId)
+ if (prevSelected) {
+ prevSelected.marker.setIcon(this.visitedMarkerIcon())
+ }
+ }
+
+ marker.setIcon(this.selectedMarkerIcon())
+
+ loadListing(prop._id).then(l => l.text()).then(l => {
+ this.dispatch({
+ type: 'UPDATE_ROUTE',
+ action: {
+ toDispatch: {
+ type: 'VIEW_LISTING_DETAILS',
+ action: {
+ id: prop._id,
+ listing: JSON.parse(l)
+ }
+ },
+ params: {
+ listingId: prop._id
+ }
+ }
+ })
+
+ //this.dispatch({type: 'UPDATE_ROUTE', action: {type: 'VIEW_LISTING_DETAILS', action: {
+ //id: prop._id,
+ //listing: JSON.parse(l)
+ //}}});
+
+ this.dispatch({
+ type: 'VIEW_LISTING_DETAILS',
+ action: {
+ id: prop._id,
+ listing: JSON.parse(l)
+ }
+ })
+ })
+ })
+
+ newMarkers.push({
+ marker,
+ id: prop._id
+ })
+ }
+ }
+
+ this.dispatch({
+ type: 'PINS_LOADED',
+ action: {
+ newMarkers
+ }
+ })
+ })
+ })
+ }
+
+ /*
+ * Refreshes search
+ */
+ refreshListings (more = false) {
+ // TODO: move somewhere else
+
+ if (!more && this.state.listingId) {
+ loadListing(this.state.listingId).then(l => l.text()).then(l => {
+ this.dispatch({
+ type: 'VIEW_LISTING_DETAILS',
+ action: {
+ id: this.state.listingId,
+ listing: JSON.parse(l)
+ }
+ })
+ })
+ }
+
+ if (!more) {
+ this.loadPins()
+ }
+
+ const map = this.map
+ const {
+ rooms,
+ minSize,
+ maxSize,
+ minPrice,
+ maxPrice,
+ category
+ } = this.state.filters
+
+ const bounds = map.getBounds()
+ const properties = loadProperties({
+ bounds: bounds.toUrlValue(),
+ rooms,
+ minSize,
+ maxSize,
+ minPrice,
+ maxPrice,
+ category,
+ page: this.state.page,
+ sort: this.state.sort
+ })
+
+ properties
+ .then(p => {
+ return {
+ body: p.text(),
+ totalCount: p.headers.get('X-Total-Count')
+ }
+ })
+ .then(({body, totalCount}) => {
+ body.then(p => {
+ const data = JSON.parse(p)
+
+ this.dispatch({
+ type: 'LISTINGS_LOADED',
+ action: {
+ listings: data,
+ more,
+ totalCount
+ }
+ })
+ })
+ })
+ }
+
+ /*
+ * Get default marker icon
+ */
+ defaultMarkerIcon () {
+ const sf = 0.5
+ const width = 48
+ const height = 64
+ const icon = {
+ url: 'static/images/pins_sprite.png',
+ size: new google.maps.Size(width * sf, height * sf),
+ scaledSize: new google.maps.Size(730 * sf, 102 * sf),
+ origin: new google.maps.Point(0, 36 * sf)
+ }
+
+ return icon
+ }
+
+ /*
+ * Get visited marker icon
+ */
+ visitedMarkerIcon () {
+ const sf = 0.5
+ const width = 48
+ const height = 64
+ const icon = {
+ url: 'static/images/pins_sprite.png',
+ size: new google.maps.Size(width * sf, height * sf),
+ scaledSize: new google.maps.Size(730 * sf, 102 * sf),
+ origin: new google.maps.Point(152 * sf, 36 * sf)
+ }
+
+ return icon
+ }
+
+ /*
+ * Visited hovered marker icon
+ */
+ visitedHoveredMarkerIcon () {
+ const sf = 0.5
+ const width = 61
+ const height = 82
+ const icon = {
+ url: 'static/images/pins_sprite.png',
+ size: new google.maps.Size(width * sf, height * sf),
+ scaledSize: new google.maps.Size(730 * sf, 102 * sf),
+ origin: new google.maps.Point(480 * sf, 18 * sf)
+ }
+
+ return icon
+ }
+
+ /*
+ * Hovered marker icon
+ */
+ hoveredMarkerIcon () {
+ const sf = 0.5
+ const width = 61
+ const height = 82
+ const icon = {
+ url: 'static/images/pins_sprite.png',
+ size: new google.maps.Size(width * sf, height * sf),
+ scaledSize: new google.maps.Size(730 * sf, 102 * sf),
+ origin: new google.maps.Point(303 * sf, 18 * sf)
+ }
+
+ return icon
+ }
+
+ /*
+ * Selected marker icon
+ */
+ selectedMarkerIcon () {
+ const sf = 0.5
+ const width = 73
+ const height = 100
+ const icon = {
+ url: 'static/images/pins_sprite.png',
+ size: new google.maps.Size(width * sf, height * sf),
+ scaledSize: new google.maps.Size(730 * sf, 102 * sf),
+ origin: new google.maps.Point(655 * sf, 1 * sf)
+ }
+
+ return icon
+ }
+
+ renderRightContent () {
+ const children = []
+
+ if (this.state.listingDetails) {
+ const listing = this.state.listing //this.state.listings.get(this.state.listingId);
+ children.push(
+
+ )
+ } else {
+ children.push(
+
+ )
+ children.push(
+
+ )
+ }
+ const content = (
+
+ {children}
+
+ )
+
+ return content
+ }
+
+ render () {
+ const leftStyle = {}
+ const rightStyle = {}
+ const listingDetails = true
+
+ let leftClass = 'left-base'
+ let rightClass = 'right-base'
+
+ if (this.state.mapClicked) {
+ leftClass = 'left-hidden'
+ rightClass = 'right-shown'
+ }
+
+ return (
+
+
+
+
+ {this.renderRightContent()}
+
+
+
+
+ )
+ }
+}
+export default Main
diff --git a/web/src/helpers/googleMaps.js b/web/src/helpers/googleMaps.js
new file mode 100644
index 0000000..cfe5470
--- /dev/null
+++ b/web/src/helpers/googleMaps.js
@@ -0,0 +1,31 @@
+export const pacSelectFirst = input => {
+ // store the original event binding function
+ var _addEventListener = input.addEventListener
+ ? input.addEventListener
+ : input.attachEvent
+
+ function addEventListenerWrapper (type, listener) {
+ // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected,
+ // and then trigger the original listener.
+ if (type == 'keydown') {
+ var orig_listener = listener
+ listener = function (event) {
+ var suggestion_selected = $('.pac-item-selected').length > 0
+ if (event.which == 13 && !suggestion_selected) {
+ var simulated_downarrow = $.Event('keydown', {
+ keyCode: 40,
+ which: 40
+ })
+ orig_listener.apply(input, [simulated_downarrow])
+ }
+
+ orig_listener.apply(input, [event])
+ }
+ }
+
+ _addEventListener.apply(input, [type, listener])
+ }
+
+ input.addEventListener = addEventListenerWrapper
+ input.attachEvent = addEventListenerWrapper
+}
diff --git a/web/src/index.js b/web/src/index.js
new file mode 100644
index 0000000..59f3f33
--- /dev/null
+++ b/web/src/index.js
@@ -0,0 +1,57 @@
+import React from 'react'
+import {render} from 'react-dom'
+import Main from './components/Main'
+
+const getInitialState = url => {
+ console.log('PARSING URL:', url)
+ const params = window.location.search.substr(1).split('&')
+
+ const initialState = {
+ rooms: {},
+ category: {}
+ }
+
+ for (const param of params) {
+ const [key, value] = param.split('=')
+ console.log('analyzing param ', key, value)
+ if (key === 'rooms' && value !== '') {
+ console.log("IT's ROOMS")
+ value.split(',').forEach(k => {
+ console.log("IT's ROOMS", k)
+ initialState.rooms[parseInt(k)] = true
+ })
+ }
+
+ if (key === 'category' && value !== '') {
+ value.split(',').forEach(k => {
+ initialState.category[parseInt(k)] = true
+ })
+ }
+
+ if (key === 'sort') {
+ initialState.sort = value
+ }
+
+ if (key === 'bounds') {
+ initialState.bounds = value
+ }
+
+ if (key === 'listingId') {
+ initialState.listingId = value
+ }
+
+ if (key === 'zoom') {
+ initialState.zoom = parseInt(value)
+ }
+
+ if (['minSize', 'maxSize', 'minPrice', 'maxPrice'].includes(key)) {
+ initialState[key] = parseFloat(value)
+ }
+ }
+
+ return initialState
+}
+
+const main =
+
+render(main, document.getElementById('root'))
diff --git a/web/src/lib/api.js b/web/src/lib/api.js
new file mode 100644
index 0000000..e58382c
--- /dev/null
+++ b/web/src/lib/api.js
@@ -0,0 +1,56 @@
+import fetch from 'isomorphic-fetch'
+
+export const loadListing = id => {
+ let url = `http://localhost:3001/api/search/listings/${id}`
+
+ return fetch(
+ url,
+ {
+ //credentials: 'include'
+ }
+ )
+}
+
+export const loadProperties = (
+ {
+ bounds,
+ minPrice = '',
+ maxPrice = '',
+ minSize = '',
+ maxSize = '',
+ rooms = {},
+ category = {},
+ page = 1,
+ pins = false,
+ sort = ''
+ }
+) => {
+ const allRooms = Object.keys(rooms).filter(v => rooms[v]).join(',')
+
+ const allCategories = Object.keys(category)
+ .filter(v => category[v])
+ .join(',')
+
+ // TODO: handle errors
+ //return fetch(process.env.API_URL + '/api/search', {
+ let url = `http://localhost:3001/api/search/listings?bounds=${bounds}&minPrice=${minPrice}&maxPrice=${maxPrice}&rooms=${allRooms}&minSize=${minSize}&maxSize=${maxSize}&category=${allCategories}&page=${page}&pins=${pins}&sort=${sort}`
+
+ return fetch(
+ url,
+ {
+ //credentials: 'include'
+ }
+ )
+}
+
+export const markSeen = id => {
+ const seen = JSON.parse(window.localStorage.getItem('seen') || '[]')
+ seen.push(id)
+ window.localStorage.setItem('seen', JSON.stringify(seen))
+}
+
+export const loadSeen = id => {
+ const seen = JSON.parse(window.localStorage.getItem('seen') || '[]')
+ return seen
+ //return seen.findIndex(s => s === id) !== -1;
+}
diff --git a/web/src/lib/handlers.js b/web/src/lib/handlers.js
new file mode 100644
index 0000000..1e00792
--- /dev/null
+++ b/web/src/lib/handlers.js
@@ -0,0 +1,311 @@
+import {markSeen} from './api'
+
+const setMaxPrice = ({type, action}, component) => {
+ const maxPrice = parseFloat(action.maxPrice)
+ component.setState({
+ page: 0,
+ filters: {
+ ...component.state.filters,
+ maxPrice: isNaN(maxPrice) ? undefined : maxPrice,
+ priceDirty: true
+ }
+ })
+}
+
+const setMinPrice = ({type, action}, component) => {
+ const minPrice = parseFloat(action.minPrice)
+ component.setState({
+ page: 0,
+ filters: {
+ ...component.state.filters,
+ minPrice: isNaN(minPrice) ? undefined : minPrice,
+ priceDirty: true
+ }
+ })
+}
+
+const setMinSize = ({type, action}, component) => {
+ const minSize = parseFloat(action.minSize)
+ component.setState({
+ page: 0,
+ filters: {
+ ...component.state.filters,
+ minSize: isNaN(minSize) ? undefined : minSize,
+ sizeDirty: true
+ }
+ })
+}
+
+const setMaxSize = ({type, action}, component) => {
+ const maxSize = parseFloat(action.maxSize)
+ component.setState({
+ page: 0,
+ filters: {
+ ...component.state.filters,
+ maxSize: isNaN(maxSize) ? undefined : maxSize,
+ sizeDirty: true
+ }
+ })
+}
+
+const viewListingDetails = ({type, action}, component) => {
+ const scrollElem = document.querySelector('.right-content')
+ component.savedScrollTop = scrollElem.scrollTop
+
+ //component.router.listingId = action.id;
+
+ component.setState(
+ {
+ listingDetails: true,
+ listingId: action.id,
+ descriptionExpanded: false,
+ imageIndex: 0,
+ listing: action.listing
+ },
+ () => {
+ //component.router.update();
+ markSeen(action.id)
+ const m = component.findMarker(action.id)
+ if (m) {
+ m.marker.setIcon(component.selectedMarkerIcon())
+ }
+
+ scrollElem.scrollTop = 0
+ }
+ )
+}
+
+const listingsLoaded = ({type, action}, component) => {
+ const currentListings = new Map()
+
+ for (const listing of action.listings) {
+ currentListings.set(listing._id, listing)
+ }
+
+ component.setState({
+ listings: action.more
+ ? new Map([...component.state.listings, ...currentListings])
+ : currentListings,
+ loadingMore: false,
+ totalCount: action.totalCount
+ })
+}
+
+const pinsLoaded = ({type, action}, component) => {
+ component.setState({}, () => {
+ component.markers = action.newMarkers
+ })
+}
+
+const expandDescription = ({type, action}, component) => {
+ component.setState({
+ descriptionExpanded: true
+ })
+}
+
+const prevImage = ({type, action}, component) => {
+ const index = component.state.imageIndex
+ if (index > 0) {
+ component.setState({
+ imageIndex: index - 1
+ })
+ }
+}
+
+const nextImage = ({type, action}, component) => {
+ const index = component.state.imageIndex
+ component.setState({
+ imageIndex: index + 1
+ })
+}
+
+const viewImage = ({type, action}, component) => {
+ component.setState({
+ imageIndex: action.index
+ })
+}
+
+const searchPlaceChanged = ({type, action}, component) => {
+ component.setState({
+ listingDetails: false,
+ page: 0
+ })
+}
+
+const setRooms = ({type, action}, component) => {
+ const prevRooms = component.state.filters.rooms || {}
+
+ component.setState(
+ {
+ page: 0,
+ filters: {
+ ...component.state.filters,
+ rooms: {
+ ...prevRooms,
+ [action.rooms]: !prevRooms[action.rooms]
+ }
+ }
+ },
+ () => {
+ component.refreshListings()
+ }
+ )
+}
+
+const updateSearch = ({type, action}, component) => {
+ component.setState(
+ {
+ filters: {
+ ...component.state.filters,
+ sizeDirty: false,
+ priceDirty: false
+ }
+ },
+ () => {
+ component.refreshListings()
+ }
+ )
+}
+
+const setCategory = ({type, action}, component) => {
+ const prevCategory = component.state.filters.category || {}
+
+ component.setState(
+ {
+ page: 0,
+ filters: {
+ ...component.state.filters,
+ category: {
+ ...prevCategory,
+ [action.category]: !prevCategory[action.category]
+ }
+ }
+ },
+ () => {
+ component.refreshListings()
+ }
+ )
+}
+
+const onListingMouseOver = ({type, action}, component) => {
+ const marker = component.findMarker(action.id)
+ if (marker) {
+ const seen = component.isSeen(action.id)
+ if (seen) {
+ marker.marker.setIcon(component.visitedHoveredMarkerIcon())
+ } else {
+ marker.marker.setIcon(component.hoveredMarkerIcon())
+ }
+
+ marker.marker.setAnimation(google.maps.Animation.BOUNCE)
+ setTimeout(
+ () => {
+ marker.marker.setAnimation(null)
+
+ if (seen) {
+ marker.marker.setIcon(component.visitedMarkerIcon())
+ } else {
+ marker.marker.setIcon(component.defaultMarkerIcon())
+ }
+ },
+ 710
+ )
+ }
+}
+
+const backToResults = ({type, action}, component) => {
+ const prevSelected = component.findMarker(component.state.listingId)
+ component.setState(
+ {
+ listingId: null,
+ listingDetails: false
+ },
+ () => {
+ //component.router.update();
+
+ if (prevSelected) {
+ prevSelected.marker.setIcon(component.visitedMarkerIcon())
+ }
+
+ const scrollElem = document.querySelector('.right-content')
+ scrollElem.scrollTop = component.savedScrollTop
+ }
+ )
+}
+
+const loadMoreListings = ({type, action}, component) => {
+ const currentPage = component.state.page
+ if (currentPage * 20 < component.state.totalCount) {
+ component.setState(
+ {
+ loadingMore: true,
+ page: currentPage + 1
+ },
+ () => {
+ component.refreshListings(true)
+ }
+ )
+ }
+}
+
+const mapIdle = ({type, action}, component) => {
+ component.setState(
+ {
+ page: 0
+ },
+ () => {
+ const scrollElem = document.querySelector('.right-content')
+ scrollElem.scrollTop = 0
+ component.refreshListings()
+ }
+ )
+}
+
+const sortChange = ({type, action}, component) => {
+ component.setState(
+ {
+ sort: action.sort,
+ page: 0
+ },
+ () => {
+ //component.router.update();
+ component.refreshListings()
+ }
+ )
+}
+
+const updateRoute = ({type, action}, component) => {
+ component.router.update(action)
+}
+
+const handlers = {
+ SET_MIN_PRICE: setMinPrice,
+ SET_MAX_PRICE: setMaxPrice,
+ SET_MIN_SIZE: setMinSize,
+ SET_MAX_SIZE: setMaxSize,
+ LISTINGS_LOADED: listingsLoaded,
+ EXPAND_DESCRIPTION: expandDescription,
+ PREV_IMAGE: prevImage,
+ NEXT_IMAGE: nextImage,
+ VIEW_IMAGE: viewImage,
+ SEARCH_PLACE_CHANGED: searchPlaceChanged,
+ SET_ROOMS: setRooms,
+ VIEW_LISTING_DETAILS: viewListingDetails,
+ UPDATE_SEARCH: updateSearch,
+ SET_CATEGORY: setCategory,
+ ON_LISTING_MOUSE_OVER: onListingMouseOver,
+ BACK_TO_RESULTS: backToResults,
+ LOAD_MORE_LISTINGS: loadMoreListings,
+ MAP_IDLE: mapIdle,
+ PINS_LOADED: pinsLoaded,
+ SORT_CHANGE: sortChange,
+ UPDATE_ROUTE: updateRoute
+}
+
+export const handleMessage = ({type, action}, component) => {
+ if (!handlers[type]) {
+ throw new `Unhandled message: ${type}`()
+ }
+
+ return handlers[type]({type, action}, component)
+}
diff --git a/web/src/lib/helpers.js b/web/src/lib/helpers.js
new file mode 100644
index 0000000..674a5d4
--- /dev/null
+++ b/web/src/lib/helpers.js
@@ -0,0 +1,20 @@
+export const formatPrice = p => {
+ if (isNaN(p)) {
+ return 'Po dogovoru'
+ }
+
+ return p.toLocaleString('bs') + ' KM'
+}
+
+export const formatFilterNumber = num => {
+ if (isNaN(num) || num == null) {
+ return ''
+ }
+ return num
+}
+
+export const galleryImageUrl = img =>
+ img && img.replace('upload/', 'upload/w_500/')
+
+export const listingImageUrl = img =>
+ img && img.replace('upload/', 'upload/w_205/')
diff --git a/web/src/lib/router.js b/web/src/lib/router.js
new file mode 100644
index 0000000..d7d57d6
--- /dev/null
+++ b/web/src/lib/router.js
@@ -0,0 +1,95 @@
+import clone from 'lodash.clonedeep'
+
+export default class Router {
+ constructor (comp, initialState) {
+ this.component = comp
+ this.state = clone(initialState) || {}
+
+ window.onpopstate = event => {
+ const state = event.state
+ if (state) {
+ if (state.toDispatch) {
+ this.component.dispatch(state.toDispatch)
+ }
+ }
+ }
+ }
+
+ update (state) {
+ const params = []
+ if (state.params) {
+ let cloned = clone(state)
+
+ if (cloned.params.rooms != null) {
+ this.state.rooms[cloned.params.rooms] = !this.state.rooms[
+ cloned.params.rooms
+ ]
+ }
+
+ if (cloned.params.category != null) {
+ this.state.category[cloned.params.category] = !this.state.category[
+ cloned.params.category
+ ]
+ }
+
+ delete cloned.params['rooms']
+ delete cloned.params['category']
+
+ this.state = Object.assign(this.state, cloned.params)
+
+ const {
+ listingId,
+ minPrice,
+ maxPrice,
+ minSize,
+ maxSize,
+ bounds,
+ sort,
+ rooms = {},
+ category = {},
+ zoom
+ } = this.state
+
+ if (listingId) {
+ params.push(`listingId=${listingId}`)
+ }
+
+ params.push(`sort=${sort}`)
+ params.push(`bounds=${bounds}`)
+ params.push(`zoom=${zoom}`)
+ if (maxPrice) {
+ params.push(`maxPrice=${maxPrice}`)
+ }
+
+ if (minPrice) {
+ params.push(`minPrice=${minPrice}`)
+ }
+
+ if (minSize) {
+ params.push(`minSize=${minSize}`)
+ }
+
+ if (maxSize) {
+ params.push(`maxSize=${maxSize}`)
+ }
+ params.push(
+ `rooms=${Object.keys(rooms).filter(v => rooms[v]).join(',')}`
+ )
+ params.push(
+ `category=${Object.keys(category).filter(v => category[v]).join(',')}`
+ )
+ }
+
+ if (state.toDispatch) {
+ window.history.pushState(state, '', `/?${params.join('&')}`)
+ } else {
+ const oldState = window.history.state
+ if (oldState) {
+ const newState = Object.assign(oldState, state)
+ window.history.replaceState(newState, '', `/?${params.join('&')}`)
+ } else {
+ window.history.replaceState(state, '', `/?${params.join('&')}`)
+ }
+ }
+ }
+}
diff --git a/web/webpack.config.js b/web/webpack.config.js
index fe7c080..8bc032d 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -1,5 +1,5 @@
module.exports = {
- entry: ["./index.js"],
+ entry: ["./src/index.js"],
output: {
path: __dirname + "/dist",
filename: "app.bundle.js",
diff --git a/web/yarn.lock b/web/yarn.lock
index 13300be..22a53a1 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -11,10 +11,31 @@ accepts@~1.3.3:
mime-types "~2.1.11"
negotiator "0.6.1"
-acorn@^3.0.0:
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ dependencies:
+ acorn "^3.0.4"
+
+acorn@^3.0.0, acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+acorn@^5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
+ajv-keywords@^1.0.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.7.0:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.6.tgz#947e93049790942b2a2d60a8289b28924d39f987"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
ajv@^4.9.1:
version "4.11.5"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd"
@@ -34,6 +55,10 @@ amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@@ -66,6 +91,12 @@ are-we-there-yet@~1.1.2:
delegates "^1.0.0"
readable-stream "^2.0.0 || ^1.1.13"
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
arr-diff@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
@@ -76,10 +107,24 @@ arr-flatten@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b"
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
array-unique@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
@@ -146,7 +191,7 @@ aws4@^1.2.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
-babel-code-frame@^6.22.0, babel-code-frame@6.22.0:
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0, babel-code-frame@6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
dependencies:
@@ -665,7 +710,7 @@ babel-register@^6.24.0:
mkdirp "^0.5.1"
source-map-support "^0.4.2"
-babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
dependencies:
@@ -778,7 +823,7 @@ browserify-zlib@^0.1.4:
dependencies:
pako "~0.2.0"
-buffer-shims@^1.0.0:
+buffer-shims@^1.0.0, buffer-shims@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
@@ -790,6 +835,10 @@ buffer@^4.9.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -798,10 +847,31 @@ bytes@2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070"
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ dependencies:
+ callsites "^0.2.0"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
camelcase@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -813,7 +883,7 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"
-chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3, chalk@1.1.3:
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3, chalk@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
@@ -838,6 +908,20 @@ chokidar@^1.0.0:
optionalDependencies:
fsevents "^1.0.0"
+circular-json@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
+
+cli-cursor@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
cliui@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
@@ -878,6 +962,12 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
+common-tags@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0"
+ dependencies:
+ babel-runtime "^6.18.0"
+
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -903,6 +993,14 @@ concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+concat-stream@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
connect-history-api-fallback@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
@@ -968,6 +1066,18 @@ crypto-browserify@3.3.0:
ripemd160 "0.2.0"
sha.js "2.2.6"
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ dependencies:
+ array-find-index "^1.0.1"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -996,7 +1106,7 @@ debug@2.6.1:
dependencies:
ms "0.7.2"
-decamelize@^1.0.0:
+decamelize@^1.0.0, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -1004,6 +1114,22 @@ deep-extend@~0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+del@^2.0.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -1026,6 +1152,17 @@ detect-indent@^4.0.0:
dependencies:
repeating "^2.0.0"
+dlv@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.0.tgz#fee1a7c43f63be75f3f679e85262da5f102764a7"
+
+doctrine@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
domain-browser@^1.1.1:
version "1.1.7"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
@@ -1068,14 +1205,153 @@ errno@^0.1.3:
dependencies:
prr "~0.0.0"
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.15"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.15.tgz#c330a5934c1ee21284a7c081a86e5fd937c91ea6"
+ dependencies:
+ es6-iterator "2"
+ es6-symbol "~3.1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@2:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-symbol "^3.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1, es6-symbol@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
-escape-string-regexp@^1.0.2:
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint, eslint@*, eslint@^3.17.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc"
+ dependencies:
+ babel-code-frame "^6.16.0"
+ chalk "^1.1.3"
+ concat-stream "^1.5.2"
+ debug "^2.1.1"
+ doctrine "^2.0.0"
+ escope "^3.6.0"
+ espree "^3.4.0"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ glob "^7.0.3"
+ globals "^9.14.0"
+ ignore "^3.2.0"
+ imurmurhash "^0.1.4"
+ inquirer "^0.12.0"
+ is-my-json-valid "^2.10.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.5.1"
+ json-stable-stringify "^1.0.0"
+ levn "^0.3.0"
+ lodash "^4.0.0"
+ mkdirp "^0.5.0"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.1"
+ pluralize "^1.2.1"
+ progress "^1.1.8"
+ require-uncached "^1.0.2"
+ shelljs "^0.7.5"
+ strip-bom "^3.0.0"
+ strip-json-comments "~2.0.1"
+ table "^3.7.8"
+ text-table "~0.2.0"
+ user-home "^2.0.0"
+
+espree@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.1.tgz#28a83ab4aaed71ed8fe0f5efe61b76a05c13c4d2"
+ dependencies:
+ acorn "^5.0.1"
+ acorn-jsx "^3.0.0"
+
+esprima@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esquery@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
+ dependencies:
+ estraverse "~4.1.0"
+ object-assign "^4.0.1"
+
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estraverse@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
+
esutils@^2.0.0, esutils@^2.0.2, esutils@2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
@@ -1084,6 +1360,13 @@ etag@~1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
eventemitter3@1.x.x:
version "1.2.0"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
@@ -1098,6 +1381,10 @@ eventsource@0.1.6:
dependencies:
original ">=0.0.5"
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
expand-brackets@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -1157,6 +1444,10 @@ extsprintf@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
faye-websocket@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
@@ -1181,6 +1472,20 @@ fbjs@^0.8.1, fbjs@^0.8.4:
setimmediate "^1.0.5"
ua-parser-js "^0.7.9"
+figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
filename-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
@@ -1222,6 +1527,21 @@ find-up@^1.0.0:
path-exists "^2.0.0"
pinkie-promise "^2.0.0"
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+flat-cache@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
flow-parser@0.40.0:
version "0.40.0"
resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.40.0.tgz#b3444742189093323c4319c4fe9d35391f46bcbc"
@@ -1301,7 +1621,21 @@ gauge@~2.7.1:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
-get-stdin@5.0.1:
+generate-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+ dependencies:
+ is-property "^1.0.0"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stdin@^5.0.1, get-stdin@5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
@@ -1324,7 +1658,7 @@ glob-parent@^2.0.0:
dependencies:
is-glob "^2.0.0"
-glob@^7.0.5, glob@7.1.1:
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
dependencies:
@@ -1335,10 +1669,32 @@ glob@^7.0.5, glob@7.1.1:
once "^1.3.0"
path-is-absolute "^1.0.0"
-globals@^9.0.0:
+glob@~7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.0.0, globals@^9.14.0:
version "9.17.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
graceful-fs@^4.1.2:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
@@ -1388,6 +1744,10 @@ home-or-tmp@^2.0.0:
os-homedir "^1.0.0"
os-tmpdir "^1.0.1"
+hosted-git-info@^2.1.4:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8"
+
http-errors@~1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750"
@@ -1441,6 +1801,24 @@ ieee754@^1.1.4:
version "1.1.8"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+ignore@^3.2.0, ignore@^3.2.4:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ dependencies:
+ repeating "^2.0.0"
+
+indent-string@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d"
+
indexof@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
@@ -1452,7 +1830,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3:
+inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@@ -1464,10 +1842,32 @@ ini@~1.3.0:
version "1.3.4"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+inquirer@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
interpret@^0.6.4:
version "0.6.6"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b"
+interpret@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.2.tgz#f4f623f0bb7122f15f5717c8e254b8161b5c5b2d"
+
invariant@^2.2.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
@@ -1478,6 +1878,10 @@ ipaddr.js@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
is-binary-path@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
@@ -1488,6 +1892,12 @@ is-buffer@^1.0.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
is-dotfile@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
@@ -1522,6 +1932,10 @@ is-fullwidth-code-point@^1.0.0:
dependencies:
number-is-nan "^1.0.0"
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
is-glob@^2.0.0, is-glob@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -1534,12 +1948,37 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
+is-my-json-valid@^2.10.0:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
is-number@^2.0.2, is-number@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
dependencies:
kind-of "^3.0.2"
+is-path-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+ dependencies:
+ path-is-inside "^1.0.1"
+
is-posix-bracket@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@@ -1548,6 +1987,16 @@ is-primitive@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+is-property@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-resolvable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
+ dependencies:
+ tryit "^1.0.1"
+
is-stream@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -1556,6 +2005,10 @@ is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -1603,6 +2056,13 @@ js-tokens@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
+js-yaml@^3.5.1:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^3.1.1"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -1619,7 +2079,7 @@ json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
-json-stable-stringify@^1.0.1:
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
dependencies:
@@ -1641,6 +2101,10 @@ jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
jsprim@^1.2.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
@@ -1664,6 +2128,23 @@ leven@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
loader-utils@^0.2.11, loader-utils@^0.2.16:
version "0.2.17"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
@@ -1673,18 +2154,40 @@ loader-utils@^0.2.11, loader-utils@^0.2.16:
json5 "^0.5.0"
object-assign "^4.0.1"
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
lodash.clonedeep:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
-lodash.merge:
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.merge, lodash.merge@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
-lodash@^4.17.2, lodash@^4.2.0:
+lodash@^4.0.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+loglevel-colored-level-prefix@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
+ dependencies:
+ chalk "^1.1.3"
+ loglevel "^1.4.1"
+
+loglevel@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.4.1.tgz#95b383f91a3c2756fd4ab093667e4309161f2bcd"
+
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@@ -1695,6 +2198,23 @@ loose-envify@^1.0.0, loose-envify@^1.1.0:
dependencies:
js-tokens "^3.0.0"
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+make-plural@~3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7"
+ optionalDependencies:
+ minimist "^1.2.0"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -1717,10 +2237,39 @@ memory-fs@~0.4.1:
errno "^0.1.3"
readable-stream "^2.0.1"
+meow@3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+messageformat-parser@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-1.0.0.tgz#3dea21419f141c50026a29d4b2239203ad613d3f"
+
+messageformat@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-1.0.2.tgz#908f4691f29ff28dae35c45436a24cff93402388"
+ dependencies:
+ glob "~7.0.6"
+ make-plural "~3.0.6"
+ messageformat-parser "^1.0.0"
+ nopt "~3.0.6"
+ reserved-words "^0.1.1"
+
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -1763,7 +2312,7 @@ minimatch@^3.0.0, minimatch@^3.0.2:
dependencies:
brace-expansion "^1.0.0"
-minimist@^1.2.0, minimist@>=0.2.0, minimist@1.2.0:
+minimist@^1.1.3, minimist@^1.2.0, minimist@>=0.2.0, minimist@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
@@ -1775,7 +2324,7 @@ minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0:
+mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
@@ -1789,10 +2338,18 @@ ms@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+mute-stream@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+
nan@^2.3.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2"
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
@@ -1853,6 +2410,21 @@ nopt@^4.0.1:
abbrev "1"
osenv "^0.1.4"
+nopt@~3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
normalize-path@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@@ -1903,6 +2475,10 @@ once@^1.3.0, once@^1.3.3:
dependencies:
wrappy "1"
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
open@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc"
@@ -1914,6 +2490,17 @@ optimist@~0.6.0, optimist@~0.6.1:
minimist "~0.0.1"
wordwrap "~0.0.2"
+optionator@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
original@>=0.0.5:
version "1.0.0"
resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
@@ -1939,6 +2526,16 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
+p-limit@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
pako@~0.2.0:
version "0.2.9"
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -1952,6 +2549,12 @@ parse-glob@^3.0.4:
is-extglob "^1.0.0"
is-glob "^2.0.0"
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
parseurl@~1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
@@ -1966,14 +2569,34 @@ path-exists@^2.0.0:
dependencies:
pinkie-promise "^2.0.0"
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+path-is-inside@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
pbkdf2-compat@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288"
@@ -1982,6 +2605,10 @@ performance-now@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
pinkie-promise@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
@@ -1998,11 +2625,19 @@ pkg-dir@^1.0.0:
dependencies:
find-up "^1.0.0"
+pluralize@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-prettier:
+prettier, prettier@^0.22.0:
version "0.22.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-0.22.0.tgz#7b37c4480d0858180407e5a8e13f0f47da7385d2"
dependencies:
@@ -2017,6 +2652,39 @@ prettier:
jest-validate "19.0.0"
minimist "1.2.0"
+prettier-eslint@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-4.4.0.tgz#ded965da6a4d32bef72bfff992afbee0c0cf0443"
+ dependencies:
+ common-tags "^1.4.0"
+ dlv "^1.1.0"
+ eslint "^3.17.0"
+ indent-string "^3.1.0"
+ lodash.merge "^4.6.0"
+ loglevel-colored-level-prefix "^1.0.0"
+ prettier "^0.22.0"
+ pretty-format "^19.0.0"
+ require-relative "^0.8.7"
+
+prettier-standard:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/prettier-standard/-/prettier-standard-3.0.1.tgz#384cff58b6c244eb91179b5cc9deed26a617a7a3"
+ dependencies:
+ babel-runtime "^6.23.0"
+ chalk "^1.1.3"
+ eslint "*"
+ find-up "^2.1.0"
+ get-stdin "^5.0.1"
+ glob "^7.1.1"
+ ignore "^3.2.4"
+ indent-string "^3.1.0"
+ lodash.memoize "^4.1.2"
+ loglevel-colored-level-prefix "^1.0.0"
+ meow "3.7.0"
+ messageformat "^1.0.2"
+ prettier-eslint "^4.3.2"
+ rxjs "^5.2.0"
+
pretty-format@^19.0.0:
version "19.0.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84"
@@ -2035,6 +2703,10 @@ process@^0.11.0:
version "0.11.9"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1"
+progress@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
promise@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
@@ -2112,6 +2784,21 @@ react@^15.3.2:
loose-envify "^1.1.0"
object-assign "^4.1.0"
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.1.4:
version "2.2.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.6.tgz#8b43aed76e71483938d12a8d46c6cf1a00b1f816"
@@ -2124,6 +2811,18 @@ react@^15.3.2:
string_decoder "~0.10.x"
util-deprecate "~1.0.1"
+readable-stream@^2.2.2:
+ version "2.2.9"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
+ dependencies:
+ buffer-shims "~1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~1.0.0"
+ util-deprecate "~1.0.1"
+
readdirp@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
@@ -2133,6 +2832,27 @@ readdirp@^2.0.0:
readable-stream "^2.0.2"
set-immediate-shim "^1.0.1"
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ dependencies:
+ resolve "^1.1.6"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
regenerate@^1.2.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
@@ -2219,17 +2939,49 @@ request@^2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.0.0"
+require-relative@^0.8.7:
+ version "0.8.7"
+ resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
+
+require-uncached@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
requires-port@1.0.x, requires-port@1.x.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+reserved-words@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.1.tgz#6f7c15e5e5614c50da961630da46addc87c0cef2"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve@^1.1.6:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235"
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
dependencies:
align-text "^0.1.1"
-rimraf@^2.5.1, rimraf@^2.6.1, rimraf@2:
+rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1, rimraf@2:
version "2.6.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
dependencies:
@@ -2239,11 +2991,27 @@ ripemd160@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce"
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+ dependencies:
+ once "^1.3.0"
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+
+rxjs@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.3.0.tgz#d88ccbdd46af290cbdb97d5d8055e52453fabe2d"
+ dependencies:
+ symbol-observable "^1.0.1"
+
safe-buffer@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
-semver@^5.3.0:
+semver@^5.3.0, "semver@2 || 3 || 4 || 5":
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -2310,6 +3078,14 @@ sha.js@2.2.6:
version "2.2.6"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba"
+shelljs@^0.7.5:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
signal-exit@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@@ -2318,6 +3094,10 @@ slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+slice-ansi@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
sntp@1.x.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -2362,6 +3142,24 @@ source-map@~0.4.1:
dependencies:
amdefine ">=0.0.4"
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
sshpk@^1.7.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77"
@@ -2406,6 +3204,12 @@ string_decoder@^0.10.25, string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+string_decoder@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667"
+ dependencies:
+ buffer-shims "~1.0.0"
+
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -2414,6 +3218,13 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
+string-width@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^3.0.0"
+
stringstream@~0.0.4:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@@ -2424,6 +3235,22 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ dependencies:
+ get-stdin "^4.0.1"
+
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
@@ -2438,6 +3265,21 @@ supports-color@^3.1.0, supports-color@^3.1.1:
dependencies:
has-flag "^1.0.0"
+symbol-observable@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
+
+table@^3.7.8:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
tapable@^0.1.8, tapable@~0.1.8:
version "0.1.10"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4"
@@ -2463,6 +3305,14 @@ tar@^2.2.1:
fstream "^1.0.2"
inherits "2"
+text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
timers-browserify@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86"
@@ -2483,10 +3333,18 @@ tough-cookie@~2.3.0:
dependencies:
punycode "^1.4.1"
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+tryit@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -2501,6 +3359,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
type-is@~1.6.14:
version "1.6.15"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
@@ -2508,6 +3372,10 @@ type-is@~1.6.14:
media-typer "0.3.0"
mime-types "~2.1.15"
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
ua-parser-js@^0.7.9:
version "0.7.12"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
@@ -2554,6 +3422,12 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
+user-home@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
+ dependencies:
+ os-homedir "^1.0.0"
+
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -2576,6 +3450,13 @@ uuid@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
vary@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
@@ -2682,6 +3563,10 @@ wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@@ -2690,6 +3575,12 @@ wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ dependencies:
+ mkdirp "^0.5.1"
+
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"