This commit is contained in:
Roger Braun 2016-10-26 19:03:55 +02:00
parent 191c02af1e
commit 4c2764c747
19 changed files with 2605 additions and 95 deletions

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<title>pleroma_fe</title>
<title>Pleroma</title>
</head>
<body>
<div id="app"></div>

View File

@ -13,7 +13,12 @@
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs"
},
"dependencies": {
"vue": "^2.0.1"
"moment": "^2.15.2",
"node-sass": "^3.10.1",
"sass-loader": "^4.0.2",
"vue": "^2.0.1",
"vue-router": "^2.0.1",
"vuex": "^2.0.0"
},
"devDependencies": {
"autoprefixer": "^6.4.0",
@ -55,12 +60,14 @@
"karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "0.0.26",
"karma-webpack": "^1.7.0",
"lodash": "^4.16.4",
"lolex": "^1.4.0",
"mocha": "^3.1.0",
"nightwatch": "^0.9.8",
"opn": "^4.0.2",
"ora": "^0.3.0",
"phantomjs-prebuilt": "^2.1.3",
"raw-loader": "^0.5.1",
"selenium-server": "2.53.1",
"semver": "^5.3.0",
"shelljs": "^0.7.4",

14
src/App.html Normal file
View File

@ -0,0 +1,14 @@
<div id="app">
<nav class='container'>
<div class='item'>
<a route-to='friends-timeline' href="#">Pleroma FE</a>
</div>
</nav>
<div class="container" id="content">
<sidebar>
<user-panel></user-panel>
<nav-panel></nav-panel>
</sidebar>
<router-view></router-view>
</div>
</div>

8
src/App.js Normal file
View File

@ -0,0 +1,8 @@
import Hello from './components/hello/Hello'
export default {
name: 'app',
components: {
Hello
}
}

383
src/App.scss Normal file
View File

@ -0,0 +1,383 @@
$main-color: #f58d2c;
$main-background: white;
$darkened-background: whitesmoke;
body {
background-color: $main-color;
background-size: cover;
background-attachment: fixed;
background-repeat: no-repeat;
background-position: 0 50px;
}
h4 {
margin: 0;
}
#content {
padding-top: 60px;
}
.text-center {
text-align: center;
}
body {
font-family: sans-serif;
font-size: 14px;
margin: 0;
}
a {
text-decoration: none;
color: $main-color;
}
.container {
display: flex;
margin: 0;
padding: 0 10px 0 10px;
}
form {
display: flex;
flex-direction: column;
padding: 0.5em;
}
.form-group {
display: flex;
flex-direction: column;
padding: 0.5em;
}
.gaps {
margin: -1em 0 0 -1em;
}
.item {
flex: 1;
}
.gaps > .item {
padding: 1em 0 0 1em;
}
.auto-size {
flex: 1
}
nav {
background: black;
width: 100%;
align-items: center;
position: fixed;
height: 50px;
}
sidebar {
width: 33.333% !important;
}
main-router {
flex: 1;
}
.status:hover {
background-color: $darkened-background;
}
/* The starting CSS styles for the enter animation */
status.ng-enter {
transition:0.5s linear all;
opacity:0;
}
/* The finishing CSS styles for the enter animation */
status.ng-enter.ng-enter-active {
opacity:1;
}
.new-status-notification {
font-size: 1.1em;
background-color: $darkened-background;
border-bottom-color: darken($darkened-background, 5%);
border-bottom-style: solid;
border-bottom-width: 1px;
&:hover {
background-color: darken($darkened-background, 5%);
}
p {
margin: 0px;
padding: 10px;
}
}
.status.compact {
color: rgba(0, 0, 0, 0.42);
font-weight: 300;
p {
margin: 0;
font-size: 0.8em
}
}
/* Panel */
.panel {
display: flex;
flex-direction: column;
background-color: $main-background;
margin: 0.5em;
border-radius: 0.5em;
}
.panel-heading {
border-radius: 0.5em 0.5em 0 0;
background-size: cover;
background-color: bisque;
padding-top: 0.3em;
padding-bottom: 0.3em;
text-align: center;
font-size: 1.3em;
}
.panel-footer {
background-color: bisque;
border-radius: 0 0 0.5em 0.5em;
}
.panel-body > p {
margin: 1em;
}
.attachments {
display: flex;
flex-wrap: wrap;
}
.attachment, attachment {
flex: 1 0 30%;
display: flex;
margin: 0.2em;
align-self: flex-start;
img {
border: 1px solid;
border-radius: 0.5em;
width: 100%;
}
video {
border: 1px solid;
border-radius: 0.5em;
width: 100%;
}
.oembed {
border: 1px solid rgba(0, 0, 0, 0.14);
width: 100%;
display: flex;
.image {
flex: 1;
display: flex;
img {
border: 0px;
border-radius: 0;
}
}
.text {
flex: 2;
margin: 8px;
h1 {
font-size: 14px;
margin: 0px;
a {
color: black;
}
}
}
}
}
.media-body {
flex: 1
}
#content {
margin: auto;
max-width: 920px;
}
.media-left {
width: 10% !important;
}
.media-body {
flex: 1;
padding-left: 0.3em;
}
.status .avatar {
width: 48px;
}
.status.compact .avatar {
width: 32px;
}
.status {
padding: 0.5em;
padding-right: 1em;
border-bottom: 1px solid silver;
}
.status-el:last-child .status {
border: none
}
[ng-click] {
cursor: pointer;
}
nav-panel ul {
list-style: none;
margin: 0;
padding: 0;
}
nav-panel li {
border-bottom: 1px solid silver;
padding: 0.5em;
padding-left: 1em;
}
nav-panel li:last-child {
border: none;
}
nav-panel a {
display: block;
width: 100%;
}
.status-el p {
margin: 0;
margin-top: 0.2em;
margin-bottom: 0.5em;
}
.user-info {
padding: 1em;
img {
border: 3px solid;
border-radius: 0.5em
}
.user-screen-name {
font-weight: lighter;
}
}
.user-counts {
display: flex;
padding: 1em 1em 0em 1em;
}
.user-count {
flex: 1;
h5 {
font-weight: lighter;
margin: 0;
}
span {
color: $main-color;
}
}
.fa {
color: $main-color;
}
.status-actions {
width: 50%;
display: flex;
div, favorite-button {
flex: 1;
}
}
status-text-container {
display: block;
}
attention {
color: $main-color;
}
.form-bottom {
display: flex;
padding: 0.5em;
media-upload {
font-size: 26px;
flex: 1;
}
button {
flex: 2;
}
}
.status-el {
line-height: 18px;
.notify {
.avatar {
border-width: 3px;
border-color: $main-color;
border-style: solid;
}
}
.media-left {
img {
margin-top: 0.2em;
float: right;
margin-right: 0.3em;
border-radius: 20%;
}
}
.retweet-info {
padding: 0.3em;
.media-left {
display: flex;
i {
align-self: center;
text-align: right;
flex: 1;
padding-right: 0.3em;
}
}
}
.media-heading {
small {
font-weight: lighter;
}
}
}

View File

@ -1,28 +1,4 @@
<template>
<div id="app">
<img src="./assets/logo.png">
<hello></hello>
</div>
</template>
<template src="./App.html"></template>
<script>
import Hello from './components/hello/Hello'
export default {
name: 'app',
components: {
Hello
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
<script src="./App.js"></script>
<style lang="scss" src="./App.scss"></style>

View File

@ -1,44 +0,0 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<h2>Essential Links</h2>
<ul>
<li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
<li><a href="https://gitter.im/vuejs/vue" target="_blank">Gitter Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
<br>
<li><a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a></li>
</ul>
<h2>Ecosystem</h2>
<ul>
<li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
<li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
<li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
</ul>
</div>
</template>
<script src='./Hello.js' />
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

View File

@ -3,6 +3,6 @@ export default {
data () {
return {
msg: 'Welcome to Your Vue.js app'
};
}
};
}
}

View File

@ -0,0 +1,11 @@
import Timeline from '../timeline/timeline.vue'
const PublicTimeline = {
components: {
Timeline
},
computed: {
timeline () { return this.$store.state.statuses.timelines.public }
}
}
export default PublicTimeline

View File

@ -0,0 +1,10 @@
<template>
<div class="panel panel-default">
<div class="panel-heading">Public Timeline</div>
<div class="panel-body">
<Timeline v-bind:timeline="timeline" />
</div>
</div>
</template>
<script src="./public_timeline.js"></script>

View File

@ -0,0 +1,7 @@
const Timeline = {
props: [
'timeline'
]
}
export default Timeline;

View File

@ -0,0 +1,7 @@
<template>
<div class="timeline">
<h1>Timeline goes here</h1>
<h2 v-for="status in timeline.visibleStatuses">{{status.text}}</h2>
</div>
</template>
<script src="./timeline.js"></script>

View File

@ -1,8 +1,31 @@
import Vue from 'vue'
import App from './App'
import VueRouter from 'vue-router'
import Vuex from 'vuex'
import App from './App.vue'
import PublicTimeline from './components/public_timeline/public_timeline.vue'
import statuses from './modules/statuses.js'
Vue.use(Vuex)
Vue.use(VueRouter)
const store = new Vuex.Store({
modules: {
statuses
}
})
const routes = [
{ path: '/', redirect: '/main/public' },
{ path: '/main/public', component: PublicTimeline }
]
const router = new VueRouter({routes})
/* eslint-disable no-new */
new Vue({
router,
store,
el: '#app',
template: '<App/>',
components: { App }

100
src/modules/statuses.js Normal file
View File

@ -0,0 +1,100 @@
import { last, intersectionBy, sortBy, unionBy, toInteger, groupBy, differenceBy, each, find } from 'lodash'
// import moment from 'moment'
const defaultState = {
allStatuses: [],
maxId: 0,
timelines: {
public: {
statuses: [],
faves: [],
visibleStatuses: [],
newStatusCount: 0,
maxId: 0,
minVisibleId: 0
},
publicAndExternal: {
statuses: [],
faves: [],
visibleStatuses: [],
newStatusCount: 0,
maxId: 0,
minVisibleId: 0
},
friends: {
statuses: [],
faves: [],
visibleStatuses: [],
newStatusCount: 0,
maxId: 0,
minVisibleId: 0
}
}
}
const statusType = (status) => {
return !status.is_post_verb && status.uri.match(/fave/) ? 'fave' : 'status'
}
const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visibleStatuses, newStatusCount, faves }) => {
const statusesAndFaves = groupBy(addedStatuses, statusType)
const addedFaves = statusesAndFaves['fave'] || []
const unseenFaves = differenceBy(addedFaves, faves, 'id')
// Update fave count
each(unseenFaves, ({in_reply_to_status_id}) => {
const status = find(statuses, { id: toInteger(in_reply_to_status_id) })
if (status) {
status.fave_num += 1
}
})
addedStatuses = statusesAndFaves['status'] || []
// Add some html to the statuses.
each(addedStatuses, (status) => {
const statusoid = status.retweeted_status || status
if (statusoid.parsedText === undefined) {
// statusoid.parsedText = statusParserService.parse(statusoid)
statusoid.parsedText = statusoid.text
}
})
const newStatuses = sortBy(
unionBy(addedStatuses, statuses, 'id'),
({id}) => -id
)
let newNewStatusCount = newStatusCount + (newStatuses.length - statuses.length)
let newVisibleStatuses = visibleStatuses
if (showImmediately) {
newVisibleStatuses = unionBy(addedStatuses, newVisibleStatuses, 'id')
newVisibleStatuses = sortBy(newVisibleStatuses, ({id}) => -id)
newNewStatusCount = newStatusCount
};
newVisibleStatuses = intersectionBy(newStatuses, newVisibleStatuses, 'id')
return {
statuses: newStatuses,
visibleStatuses: newVisibleStatuses,
newStatusCount: newNewStatusCount,
maxId: newStatuses[0].id,
minVisibleId: last(newVisibleStatuses).id,
faves: unionBy(faves, addedFaves, 'id')
}
}
const statuses = {
state: defaultState,
mutations: {
addNewStatuses (state, { statuses, showImmediately = false, timeline }) {
state.timelines[timeline] = addStatusesToTimeline(statuses, showImmediately, state.timelines[timeline])
state.allStatuses = unionBy(state.timelines[timeline].statuses, state.allStatuses.id)
}
}
}
export default statuses

View File

@ -0,0 +1,101 @@
const LOGIN_URL='/api/account/verify_credentials.json';
const FRIENDS_TIMELINE_URL='/api/statuses/friends_timeline.json';
const PUBLIC_TIMELINE_URL='/api/statuses/public_timeline.json';
const PUBLIC_AND_EXTERNAL_TIMELINE_URL='/api/statuses/public_and_external_timeline.json';
const CONVERSATION_URL = '/api/statusnet/conversation/';
const STATUS_UPDATE_URL = '/api/statuses/update.json';
const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload';
const FAVORITE_URL = '/api/favorites/create';
const UNFAVORITE_URL = '/api/favorites/destroy';
const FORM_CONTENT_TYPE = {'Content-Type': 'application/x-www-form-urlencoded'};
import { param, ajax } from 'jquery';
import { merge } from 'lodash';
// TODO: This should probably be in redux.
let authHeaders = {};
const apiServiceFactory = ($http) => {
// Public
const fetchConversation = (id) => {
return $http.get(`${CONVERSATION_URL}/${id}.json?count=100`);
};
const fetchTimeline = ({timeline, since = false, until = false}) => {
const timelineUrls = {
public: PUBLIC_TIMELINE_URL,
friends: FRIENDS_TIMELINE_URL,
'public-and-external': PUBLIC_AND_EXTERNAL_TIMELINE_URL
};
let url = timelineUrls[timeline];
if(since) {
url += `?since_id=${since}`;
}
if(until) {
url += `?max_id=${until}`;
}
return fetch(url, { headers: authHeaders }).then((data) => data.json());
};
// Need credentials
const verifyCredentials = (user) => {
const base64 = btoa(`${user.username}:${user.password}`);
authHeaders = { "Authorization": `Basic ${base64}` };
return $http.post(LOGIN_URL, null, { headers: authHeaders });
};
const postStatus = ({status, mediaIds, in_reply_to_status_id}) => {
const idsText = mediaIds.join(',');
const form = new FormData();
form.append('status', status);
form.append('source', 'The Wired FE');
form.append('media_ids', idsText);
if(in_reply_to_status_id) {
form.append('in_reply_to_status_id', in_reply_to_status_id);
};
return fetch(STATUS_UPDATE_URL, {
body: form,
method: 'POST',
headers: authHeaders
});
};
const favorite = (id) => $http.post(`${FAVORITE_URL}/${id}.json`, null, {headers: authHeaders});
const unfavorite = (id) => $http.post(`${UNFAVORITE_URL}/${id}.json`, null, {headers: authHeaders});
// This was impossible to get to work with $http. You're supposed to set Content-Type
// undefined in the header so it sends the correct header. It would always send a json
// content type. This method from jQuery worked right away...
// Also, this method is only available as XML output. OLOLOLOLO
const uploadMedia = (formData) => ajax({
url: MEDIA_UPLOAD_URL,
data: formData,
type: 'POST',
processData: false,
contentType: false,
headers: authHeaders
});
const apiService = {
verifyCredentials,
fetchConversation,
postStatus,
uploadMedia,
favorite,
unfavorite,
fetchTimeline
};
return apiService;
};
apiServiceFactory.$inject = ['$http'];
export default apiServiceFactory;

View File

@ -0,0 +1 @@
roger@yuuyuu.18961

View File

@ -0,0 +1,53 @@
import { upperFirst, camelCase } from 'lodash';
const timelineFetcherServiceFactory = ($ngRedux, apiService, $interval) => {
let fetcher;
const update = ({statuses, timeline, showImmediately}) => {
const ccTimeline = camelCase(timeline);
const action = {
type: 'ADD_NEW_STATUSES',
data: {
statuses,
timeline: ccTimeline,
showImmediately
}
};
$ngRedux.dispatch(action);
$ngRedux.dispatch({type: 'UPDATE_TIMESTAMPS'});
};
const fetchAndUpdate = ({timeline = 'friends', older = false, showImmediately = false}) => {
const args = { timeline };
const timelineData = $ngRedux.getState().statuses.timelines[camelCase(timeline)];
if(older) {
args['until'] = timelineData.minVisibleId;
} else {
args['since'] = timelineData.maxId;
}
apiService.fetchTimeline(args).
then((statuses) => update({statuses, timeline, showImmediately}));
};
const startFetching = ({timeline = 'friends'}) => {
fetchAndUpdate({timeline, showImmediately: true});
const boundFetchAndUpdate = () => fetchAndUpdate({timeline});
fetcher = $interval(boundFetchAndUpdate, 10000);
};
const timelineFetcherService = {
startFetching,
fetchAndUpdate
};
return timelineFetcherService;
};
timelineFetcherServiceFactory.$inject = ['$ngRedux', 'apiService', '$interval'];
export default timelineFetcherServiceFactory;

1658
test/fixtures/statuses.json vendored Normal file

File diff suppressed because it is too large Load Diff

233
yarn.lock
View File

@ -142,6 +142,13 @@ array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
array-index@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9"
dependencies:
debug "^2.2.0"
es6-symbol "^3.0.2"
array-slice@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
@ -214,6 +221,10 @@ async-each@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
async-foreach@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
async@^0.9.0, async@~0.9.0:
version "0.9.2"
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
@ -1016,6 +1027,10 @@ camelcase@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000554:
version "1.0.30000568"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000568.tgz#f4e67925e254afc950d7130102f28b8726037492"
@ -1151,6 +1166,14 @@ cliui@^2.1.0:
right-align "^0.1.1"
wordwrap "0.0.2"
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
clone@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
@ -1374,6 +1397,13 @@ core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
cross-spawn@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
dependencies:
lru-cache "^4.0.1"
which "^1.2.9"
cross-spawn@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
@ -1536,7 +1566,7 @@ debug@0.7.4:
version "0.7.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
decamelize@^1.0.0, decamelize@^1.1.2:
decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@ -1839,7 +1869,7 @@ es6-set@~0.1.3:
es6-symbol "3"
event-emitter "~0.3.4"
es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3:
es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa"
dependencies:
@ -2311,6 +2341,12 @@ gauge@~2.6.0:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gaze@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
dependencies:
globule "^1.0.0"
generate-function@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
@ -2321,6 +2357,10 @@ generate-object-property@^1.1.0:
dependencies:
is-property "^1.0.0"
get-caller-file@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@ -2365,7 +2405,7 @@ glob@^5.0.15:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5:
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
dependencies:
@ -2410,6 +2450,14 @@ globby@^5.0.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
globule@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f"
dependencies:
glob "~7.1.1"
lodash "~4.16.4"
minimatch "~3.0.2"
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.1.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29"
@ -2665,6 +2713,10 @@ imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
in-publish@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
indent-string@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
@ -3206,7 +3258,7 @@ load-json-file@^1.0.0:
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
loader-utils@^0.2.10, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@^0.2.5, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@~0.2.5, loader-utils@0.2.x:
loader-utils@^0.2.10, loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@^0.2.5, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@~0.2.5, loader-utils@0.2.x:
version "0.2.16"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d"
dependencies:
@ -3215,6 +3267,10 @@ loader-utils@^0.2.10, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^
json5 "^0.5.0"
object-assign "^4.0.1"
lodash, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.16.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.16.4:
version "4.16.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127"
lodash._arraycopy@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1"
@ -3315,6 +3371,10 @@ lodash._root@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
lodash.camelcase@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz#932c8b87f8a4377897c67197533282f97aeac298"
@ -3329,6 +3389,10 @@ lodash.clone@^3.0.3:
lodash._bindcallback "^3.0.0"
lodash._isiterateecall "^3.0.0"
lodash.clonedeep@^4.3.2:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
lodash.create@^3.1.1, lodash.create@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
@ -3448,10 +3512,6 @@ lodash@^3.8.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.16.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0:
version "4.16.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127"
log-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
@ -3554,7 +3614,7 @@ memory-fs@~0.3.0:
errno "^0.1.3"
readable-stream "^2.0.1"
meow@^3.3.0:
meow@^3.3.0, meow@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
dependencies:
@ -3623,7 +3683,7 @@ mime@1.2.x:
version "1.2.11"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
minimatch@^3.0.0, minimatch@^3.0.2, "minimatch@2 || 3":
minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.2, "minimatch@2 || 3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
dependencies:
@ -3699,6 +3759,10 @@ mocha@^3.1.0:
mkdirp "0.5.1"
supports-color "3.1.2"
moment:
version "2.15.2"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc"
ms@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
@ -3707,7 +3771,7 @@ 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:
nan@^2.3.0, nan@^2.3.2:
version "2.4.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
@ -3754,6 +3818,25 @@ no-case@^2.2.0:
dependencies:
lower-case "^1.1.1"
node-gyp@^3.3.1:
version "3.4.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36"
dependencies:
fstream "^1.0.0"
glob "^7.0.3"
graceful-fs "^4.1.2"
minimatch "^3.0.2"
mkdirp "^0.5.0"
nopt "2 || 3"
npmlog "0 || 1 || 2 || 3"
osenv "0"
path-array "^1.0.0"
request "2"
rimraf "2"
semver "2.x || 3.x || 4 || 5"
tar "^2.0.0"
which "1"
node-libs-browser@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.6.0.tgz#244806d44d319e048bc8607b5cc4eaf9a29d2e3c"
@ -3796,6 +3879,27 @@ node-pre-gyp@^0.6.29:
tar "~2.2.1"
tar-pack "~3.3.0"
node-sass:
version "3.10.1"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.10.1.tgz#c535b2e1a5439240591e06d7308cb663820d616c"
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
cross-spawn "^3.0.0"
gaze "^1.0.0"
get-stdin "^4.0.1"
glob "^7.0.3"
in-publish "^2.0.0"
lodash.assign "^4.2.0"
lodash.clonedeep "^4.3.2"
meow "^3.7.0"
mkdirp "^0.5.1"
nan "^2.3.2"
node-gyp "^3.3.1"
npmlog "^4.0.0"
request "^2.61.0"
sass-graph "^2.1.1"
node-uuid@~1.4.7:
version "1.4.7"
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f"
@ -3807,7 +3911,7 @@ nomnomnomnom@^2.0.0:
chalk "~0.4.0"
underscore "~1.6.0"
nopt@~3.0.1, nopt@~3.0.6, nopt@3.x:
nopt@~3.0.1, nopt@~3.0.6, "nopt@2 || 3", nopt@3.x:
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
dependencies:
@ -3862,6 +3966,15 @@ npmlog@^4.0.0:
gauge "~2.6.0"
set-blocking "~2.0.0"
"npmlog@0 || 1 || 2 || 3":
version "3.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873"
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.6.0"
set-blocking "~2.0.0"
nth-check@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
@ -3973,7 +4086,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
osenv@^0.1.0:
osenv@^0.1.0, osenv@0:
version "0.1.3"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217"
dependencies:
@ -4058,6 +4171,12 @@ pascal-case@^2.0.0:
camel-case "^3.0.0"
upper-case-first "^1.1.0"
path-array@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271"
dependencies:
array-index "^1.0.0"
path-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
@ -4501,6 +4620,10 @@ raw-body@~2.1.7:
iconv-lite "0.4.13"
unpipe "1.0.0"
raw-loader:
version "0.5.1"
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
rc@~1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9"
@ -4719,7 +4842,7 @@ request-progress@~2.0.1:
dependencies:
throttleit "^1.0.0"
request@^2.75.0:
request@^2.61.0, request@^2.75.0, request@2:
version "2.76.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e"
dependencies:
@ -4770,6 +4893,14 @@ request@~2.74.0:
tough-cookie "~2.3.0"
tunnel-agent "~0.4.1"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
require-uncached@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.2.tgz#67dad3b733089e77030124678a459589faf6a7ec"
@ -4830,6 +4961,22 @@ samsam@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
sass-graph@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.1.2.tgz#965104be23e8103cb7e5f710df65935b317da57b"
dependencies:
glob "^7.0.0"
lodash "^4.0.0"
yargs "^4.7.1"
sass-loader:
version "4.0.2"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-4.0.2.tgz#a616eb770366543e64f547c8630f39c4da75f15d"
dependencies:
async "^2.0.1"
loader-utils "^0.2.15"
object-assign "^4.1.0"
sax@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
@ -4838,7 +4985,7 @@ selenium-server@2.53.1:
version "2.53.1"
resolved "https://registry.yarnpkg.com/selenium-server/-/selenium-server-2.53.1.tgz#d681528812f3c2e0531a6b7e613e23bb02cce8a6"
semver@^5.3.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5":
semver@^5.3.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5":
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@ -4884,7 +5031,7 @@ serve-static@~1.11.1:
parseurl "~1.3.1"
send "0.14.1"
set-blocking@~2.0.0:
set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@ -5256,7 +5403,7 @@ tar-pack@~3.3.0:
tar "~2.2.1"
uid-number "~0.0.6"
tar@~2.2.1:
tar@^2.0.0, tar@~2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
dependencies:
@ -5528,6 +5675,10 @@ vue-loader@^9.4.0:
vue-template-compiler "^2.0.0-rc.3"
vue-template-es2015-compiler "^1.0.0"
vue-router:
version "2.0.1"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-2.0.1.tgz#88b83cdc9497bad5b20b579e847a7e7240e221dd"
vue-style-loader@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-1.0.0.tgz#abeb7bd0f46313083741244d3079d4f14449e049"
@ -5549,6 +5700,10 @@ vue@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.0.3.tgz#3f7698f83d6ad1f0e35955447901672876c63fde"
vuex:
version "2.0.0"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-2.0.0.tgz#26befa44de220f009e432d1027487bff29571cee"
watchpack@^0.2.1:
version "0.2.9"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b"
@ -5622,7 +5777,11 @@ whet.extend@~0.9.9:
version "0.9.9"
resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
which@^1.0.9, which@^1.1.1, which@^1.2.9, which@~1.2.10:
which-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
which@^1.0.9, which@^1.1.1, which@^1.2.9, which@~1.2.10, which@1:
version "1.2.11"
resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b"
dependencies:
@ -5638,6 +5797,10 @@ window-size@^0.1.2:
version "0.1.4"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
window-size@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
@ -5654,6 +5817,12 @@ wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
wrap-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f"
dependencies:
string-width "^1.0.1"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@ -5687,7 +5856,7 @@ xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
y18n@^3.2.0:
y18n@^3.2.0, y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
@ -5695,6 +5864,32 @@ yallist@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4"
yargs-parser@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
dependencies:
camelcase "^3.0.0"
lodash.assign "^4.0.6"
yargs@^4.7.1:
version "4.8.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
dependencies:
cliui "^3.2.0"
decamelize "^1.1.1"
get-caller-file "^1.0.1"
lodash.assign "^4.0.3"
os-locale "^1.4.0"
read-pkg-up "^1.0.1"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^1.0.1"
which-module "^1.0.0"
window-size "^0.2.0"
y18n "^3.2.1"
yargs-parser "^2.4.1"
yargs@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"